FV Flowplayer Video Player - Version 7.5.12.727

Version Description

  • 2021/11/25 =

  • Bugfix - Playlist tabs not pausing the old tab player properly

  • Bugfix - Position Saving - do not use index.m3u8 as the video ID

  • Bugfix - Video link issue for videos over 1 hour

  • Compatibility - Bunny.net WordPress CDN Plugin

  • Compatibility - WP Rocket Used CSS

  • Lightbox - Fancybox updated - double tap on image zooms in

  • Linode Object Storage support

  • Video upload support for FV Player Coconut and FV Player Bunny Stream

Download this release

Release Info

Developer FolioVision
Plugin Icon 128x128 FV Flowplayer Video Player
Version 7.5.12.727
Comparing to
See all releases

Code changes from version 7.5.10.727 to 7.5.12.727

Files changed (58) hide show
  1. controller/backend.php +17 -5
  2. controller/editor.php +20 -9
  3. controller/frontend.php +32 -2
  4. css/fancybox.css +31 -32
  5. css/flowplayer.css +46 -4
  6. css/s3-uploader.css +10 -9
  7. flowplayer.php +3 -2
  8. flowplayer/fv-player.min.js +1 -1
  9. flowplayer/modules/abr-remember.module.js +4 -0
  10. flowplayer/modules/appearance.module.js +6 -3
  11. flowplayer/modules/embed.module.js +11 -3
  12. flowplayer/modules/fv-player.js +11 -6
  13. flowplayer/modules/hls-audio.module.js +2 -2
  14. flowplayer/modules/hls-safari-fixes.module.js +6 -6
  15. flowplayer/modules/pending-encoding.module.js +57 -0
  16. flowplayer/modules/playback-position.module.js +155 -35
  17. flowplayer/modules/playlist-controlbar.module.js +13 -6
  18. flowplayer/modules/playlist-start-position.module.js +3 -4
  19. flowplayer/modules/sharing.module.js +12 -1
  20. flowplayer/modules/speed-restore.module.js +6 -0
  21. flowplayer/modules/subtitle-restore.module.js +5 -0
  22. flowplayer/modules/volume.module.js +19 -17
  23. includes/class.bunnycdn.rewrite.php +13 -0
  24. includes/class.fv-player-wizard-step-base.php +12 -5
  25. includes/fp-api-private.php +27 -13
  26. includes/fv-player-wizard-base.js +2 -2
  27. js/editor-screenshots.js +1 -1
  28. js/fancybox.js +58 -16
  29. js/linode-object-storage.js +46 -0
  30. js/media-library-browser-base.js +120 -38
  31. js/s3-upload-base.js +18 -10
  32. js/shortcode-editor.js +80 -17
  33. js/video-checker.js +8 -1
  34. languages/fv-wordpress-flowplayer-cs_CZ.mo +0 -0
  35. languages/fv-wordpress-flowplayer-cs_CZ.po +634 -15
  36. languages/fv-wordpress-flowplayer-de_DE.mo +0 -0
  37. languages/fv-wordpress-flowplayer-de_DE.po +635 -15
  38. languages/fv-wordpress-flowplayer-es_ES.mo +0 -0
  39. languages/fv-wordpress-flowplayer-es_ES.po +634 -15
  40. languages/fv-wordpress-flowplayer-sk_SK.mo +0 -0
  41. languages/fv-wordpress-flowplayer-sk_SK.po +634 -16
  42. languages/fv-wordpress-flowplayer.pot +2806 -0
  43. models/cdn.class.php +2 -2
  44. models/digitalocean-spaces-browser.class.php +18 -92
  45. models/digitalocean-spaces.class.php +1 -0
  46. models/flowplayer.php +22 -6
  47. models/linode-object-storage-browser.class.php +124 -0
  48. models/linode-object-storage.class.php +150 -0
  49. models/list-table.php +3 -4
  50. models/media-browser-s3.php +22 -97
  51. models/media-browser.php +122 -1
  52. models/player-position-save.php +74 -22
  53. models/system-info.php +4 -1
  54. models/video-encoder/class.fv-player-encoder-list-table.php +382 -0
  55. models/video-encoder/video-encoder.php +1016 -0
  56. models/xml-video-sitemap.php +6 -1
  57. readme.txt +22 -0
  58. view/admin.php +36 -19
controller/backend.php CHANGED
@@ -27,16 +27,16 @@ add_action('wp_ajax_fv_wp_flowplayer_support_mail', 'fv_wp_flowplayer_support_ma
27
  function fv_wp_flowplayer_support_mail() {
28
  if( isset( $_POST['notice'] ) ) {
29
 
30
- $current_user = wp_get_current_user();
31
-
32
- $content = '<p>User: '.$current_user->display_name." (".$current_user->user_email.")</p>\n";
33
  $content .= '<p>User Agent: '.$_SERVER['HTTP_USER_AGENT']."</p>\n";
34
  $content .= '<p>Referer: '.$_SERVER['HTTP_REFERER']."</p>\n";
35
  $content .= "<p>Comment:</p>\n".wpautop( stripslashes($_POST['comment']) );
36
  $notice = str_replace( '<span class="value"', ': <span class="value"', stripslashes($_POST['notice']) );
37
  $notice .= str_replace( '<span class="value"', ': <span class="value"', stripslashes($_POST['details']) );
38
 
39
- $content .= "<p>Video analysis:</p>\n".$notice;
40
 
41
  global $fv_wp_flowplayer_support_mail_from, $fv_wp_flowplayer_support_mail_from_name;
42
 
@@ -44,7 +44,7 @@ function fv_wp_flowplayer_support_mail() {
44
  $fv_wp_flowplayer_support_mail_from_name = $current_user->display_name;
45
  $fv_wp_flowplayer_support_mail_from = $current_user->user_email;
46
 
47
- add_filter( 'wp_mail_content_type', create_function('', "return 'text/html';") );
48
 
49
  //add_action('phpmailer_init', 'fv_wp_flowplayer_support_mail_phpmailer_init' );
50
  wp_mail( 'fvplayer@foliovision.com', 'FV Flowplayer Quick Support Submission', $content );
@@ -53,6 +53,10 @@ function fv_wp_flowplayer_support_mail() {
53
  }
54
  }
55
 
 
 
 
 
56
  function fv_wp_flowplayer_support_mail_phpmailer_init( $phpmailer ) {
57
  global $fv_wp_flowplayer_support_mail_from, $fv_wp_flowplayer_support_mail_from_name;
58
 
@@ -839,4 +843,12 @@ function fv_player_pay_per_view_woocommerce_version_check() {
839
  </div>
840
  <?php
841
  endif;
 
 
 
 
 
 
 
 
842
  }
27
  function fv_wp_flowplayer_support_mail() {
28
  if( isset( $_POST['notice'] ) ) {
29
 
30
+ $current_user = wp_get_current_user();
31
+ $content = "<h1>Admin: ".$_POST['status']."</h1>\n";
32
+ $content .= '<p>User: '.$current_user->display_name." (".$current_user->user_email.")</p>\n";
33
  $content .= '<p>User Agent: '.$_SERVER['HTTP_USER_AGENT']."</p>\n";
34
  $content .= '<p>Referer: '.$_SERVER['HTTP_REFERER']."</p>\n";
35
  $content .= "<p>Comment:</p>\n".wpautop( stripslashes($_POST['comment']) );
36
  $notice = str_replace( '<span class="value"', ': <span class="value"', stripslashes($_POST['notice']) );
37
  $notice .= str_replace( '<span class="value"', ': <span class="value"', stripslashes($_POST['details']) );
38
 
39
+ $content .= "<p>Video analysis:</p>\n".$notice;
40
 
41
  global $fv_wp_flowplayer_support_mail_from, $fv_wp_flowplayer_support_mail_from_name;
42
 
44
  $fv_wp_flowplayer_support_mail_from_name = $current_user->display_name;
45
  $fv_wp_flowplayer_support_mail_from = $current_user->user_email;
46
 
47
+ add_filter( 'wp_mail_content_type', 'fv_wp_flowplayer_support_mail_content_type' );
48
 
49
  //add_action('phpmailer_init', 'fv_wp_flowplayer_support_mail_phpmailer_init' );
50
  wp_mail( 'fvplayer@foliovision.com', 'FV Flowplayer Quick Support Submission', $content );
53
  }
54
  }
55
 
56
+ function fv_wp_flowplayer_support_mail_content_type() {
57
+ return 'text/html';
58
+ }
59
+
60
  function fv_wp_flowplayer_support_mail_phpmailer_init( $phpmailer ) {
61
  global $fv_wp_flowplayer_support_mail_from, $fv_wp_flowplayer_support_mail_from_name;
62
 
843
  </div>
844
  <?php
845
  endif;
846
+ }
847
+
848
+ // lazy-load of video encoder libraries
849
+ add_action( 'fv_player_load_video_encoder_libs', 'fv_player_load_video_encoder_libs' );
850
+ function fv_player_load_video_encoder_libs() {
851
+ include_once( dirname( __FILE__ ).'/../models/video-encoder/video-encoder.php');
852
+ require_once( dirname(__FILE__).'/../includes/class.fv-player-wizard-base.php' );
853
+ require_once( dirname(__FILE__).'/../includes/class.fv-player-wizard-step-base.php' );
854
  }
controller/editor.php CHANGED
@@ -13,12 +13,12 @@ function fv_player_shortcode_editor_scripts( $page ) {
13
 
14
 
15
 
16
- function fv_player_shortcode_editor_scripts_enqueue() {
17
  global $fv_wp_flowplayer_ver;
18
- wp_register_script('fvwpflowplayer-domwindow', flowplayer::get_plugin_url().'/js/jquery.colorbox-min.js',array('jquery'), $fv_wp_flowplayer_ver );
19
- wp_enqueue_script('fvwpflowplayer-domwindow');
20
-
21
- wp_register_script('fvwpflowplayer-shortcode-editor', flowplayer::get_plugin_url().'/js/shortcode-editor.js',array('jquery','jquery-ui-sortable'), $fv_wp_flowplayer_ver.'-fix' );
22
  wp_register_script('fvwpflowplayer-editor-screenshots', flowplayer::get_plugin_url().'/js/editor-screenshots.js',array('jquery','fvwpflowplayer-shortcode-editor','flowplayer'), $fv_wp_flowplayer_ver );
23
 
24
  wp_localize_script( 'fvwpflowplayer-shortcode-editor', 'fv_player_editor_conf', array(
@@ -59,14 +59,20 @@ function fv_player_shortcode_editor_scripts_enqueue() {
59
  ),
60
  'have_fv_player_vimeo_live' => class_exists('FV_Player_Vimeo_Live_Stream')
61
  ) );
62
-
 
 
 
 
 
 
63
  wp_localize_script( 'fvwpflowplayer-editor-screenshots', 'fv_player_editor_conf_screenshots', array(
64
  'disable_domains' => apply_filters( 'fv_player_editor_screenshot_disable_domains', array() )
65
  ) );
66
 
67
  wp_enqueue_script('fvwpflowplayer-shortcode-editor');
68
  wp_enqueue_script('fvwpflowplayer-editor-screenshots');
69
-
70
  wp_enqueue_style('fvwpflowplayer-domwindow-css', flowplayer::get_plugin_url().'/css/colorbox.css', '', $fv_wp_flowplayer_ver, 'screen');
71
  wp_enqueue_style('fvwpflowplayer-shortcode-editor', flowplayer::get_plugin_url().'/css/shortcode-editor.css', '', $fv_wp_flowplayer_ver, 'screen');
72
  }
@@ -368,9 +374,14 @@ function fv_player_splashcreen_action() {
368
 
369
  $title = getTitleFromUrl($title);
370
  $title = sanitize_title($title);
371
- $title = mb_strimwidth($title, 0, $limit, '', 'UTF-8');
 
 
 
 
 
372
 
373
- $decoded = base64_decode($img) ;
374
 
375
  $upload_dir = wp_upload_dir();
376
  $upload_path = str_replace( '/', DIRECTORY_SEPARATOR, $upload_dir['path'] ) . DIRECTORY_SEPARATOR;
13
 
14
 
15
 
16
+ function fv_player_shortcode_editor_scripts_enqueue() {
17
  global $fv_wp_flowplayer_ver;
18
+ wp_register_script('fvwpflowplayer-domwindow', flowplayer::get_plugin_url().'/js/jquery.colorbox-min.js',array('jquery'), $fv_wp_flowplayer_ver );
19
+ wp_enqueue_script('fvwpflowplayer-domwindow');
20
+
21
+ wp_register_script('fvwpflowplayer-shortcode-editor', flowplayer::get_plugin_url().'/js/shortcode-editor.js',array('jquery','jquery-ui-sortable'), $fv_wp_flowplayer_ver );
22
  wp_register_script('fvwpflowplayer-editor-screenshots', flowplayer::get_plugin_url().'/js/editor-screenshots.js',array('jquery','fvwpflowplayer-shortcode-editor','flowplayer'), $fv_wp_flowplayer_ver );
23
 
24
  wp_localize_script( 'fvwpflowplayer-shortcode-editor', 'fv_player_editor_conf', array(
59
  ),
60
  'have_fv_player_vimeo_live' => class_exists('FV_Player_Vimeo_Live_Stream')
61
  ) );
62
+
63
+ wp_localize_script( 'fvwpflowplayer-shortcode-editor', 'fv_player_editor_translations', array(
64
+ 'embed_notice' => __('Embed feature not supported in editor preview', 'fv-wordpress-flowplayer'),
65
+ 'link_notice' => __('Link feature not supported in editor preview', 'fv-wordpress-flowplayer'),
66
+ 'screenshot_cors_error' => __('<div class="error"><p>Cannot obtain video screenshot, please make sure the video is served with <a href="https://foliovision.com/player/video-hosting/hls#hls-js">CORS headers</a>.</p></div>', 'fv-wordpress-flowplayer'),
67
+ ) );
68
+
69
  wp_localize_script( 'fvwpflowplayer-editor-screenshots', 'fv_player_editor_conf_screenshots', array(
70
  'disable_domains' => apply_filters( 'fv_player_editor_screenshot_disable_domains', array() )
71
  ) );
72
 
73
  wp_enqueue_script('fvwpflowplayer-shortcode-editor');
74
  wp_enqueue_script('fvwpflowplayer-editor-screenshots');
75
+
76
  wp_enqueue_style('fvwpflowplayer-domwindow-css', flowplayer::get_plugin_url().'/css/colorbox.css', '', $fv_wp_flowplayer_ver, 'screen');
77
  wp_enqueue_style('fvwpflowplayer-shortcode-editor', flowplayer::get_plugin_url().'/css/shortcode-editor.css', '', $fv_wp_flowplayer_ver, 'screen');
78
  }
374
 
375
  $title = getTitleFromUrl($title);
376
  $title = sanitize_title($title);
377
+
378
+ if( function_exists('mb_strinwidth') ) {
379
+ $title = mb_strimwidth($title, 0, $limit, '', 'UTF-8');
380
+ } else if( strlen( $title ) > $limit ) {
381
+ $title = substr($title, 0, $limit);
382
+ }
383
 
384
+ $decoded = base64_decode($img);
385
 
386
  $upload_dir = wp_upload_dir();
387
  $upload_path = str_replace( '/', DIRECTORY_SEPARATOR, $upload_dir['path'] ) . DIRECTORY_SEPARATOR;
controller/frontend.php CHANGED
@@ -106,8 +106,10 @@ function fv_flowplayer_get_js_translations() {
106
  'and' => sprintf( __( '%1$s and %2$s' ), '', '' ),
107
  'chrome_extension_disable_html5_autoplay' => __('It appears you are using the Disable HTML5 Autoplay Chrome extension, disable it to play videos', 'fv-wordpress-flowplayer'),
108
  'click_to_unmute' => __('Click to unmute', 'fv-wordpress-flowplayer'),
 
 
109
  );
110
-
111
  return $aStrings;
112
  }
113
 
@@ -398,11 +400,15 @@ function flowplayer_prepare_scripts() {
398
  $aConf['video_checker_site'] = home_url();
399
  }
400
  if( $sLogo ) $aConf['logo'] = $sLogo;
 
 
401
  $aConf['volume'] = floatval( $fv_fp->_get_option('volume') );
402
  if( $aConf['volume'] > 1 ) {
403
  $aConf['volume'] = 1;
404
  }
405
 
 
 
406
  if( $val = $fv_fp->_get_option('mobile_native_fullscreen') ) $aConf['mobile_native_fullscreen'] = $val;
407
  if( $val = $fv_fp->_get_option('mobile_force_fullscreen') ) $aConf['mobile_force_fullscreen'] = $val;
408
  if( $val = $fv_fp->_get_option('mobile_alternative_fullscreen') ) $aConf['mobile_alternative_fullscreen'] = $val;
@@ -457,7 +463,7 @@ function flowplayer_prepare_scripts() {
457
  if( $fv_fp->_get_option('chromecast') ) {
458
  $aConf['fv_chromecast'] = $fv_fp->_get_option('chromecast');
459
  }
460
-
461
  if( $fv_fp->_get_option('hd_streaming') ) {
462
  $aConf['hd_streaming'] = true;
463
  }
@@ -466,6 +472,10 @@ function flowplayer_prepare_scripts() {
466
  $aConf['multiple_playback'] = true;
467
  }
468
 
 
 
 
 
469
  $aConf['hlsjs'] = array(
470
  'startLevel' => -1,
471
  'fragLoadingMaxRetry' => 3,
@@ -776,3 +786,23 @@ function fv_player_extension_version_is_min( $min, $extension = 'pro' ) {
776
 
777
  return version_compare($version,$min ) != -1;
778
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  'and' => sprintf( __( '%1$s and %2$s' ), '', '' ),
107
  'chrome_extension_disable_html5_autoplay' => __('It appears you are using the Disable HTML5 Autoplay Chrome extension, disable it to play videos', 'fv-wordpress-flowplayer'),
108
  'click_to_unmute' => __('Click to unmute', 'fv-wordpress-flowplayer'),
109
+ 'audio_button' => __('AUD', 'fv-wordpress-flowplayer'),
110
+ 'audio_menu' => __('Audio', 'fv-wordpress-flowplayer')
111
  );
112
+
113
  return $aStrings;
114
  }
115
 
400
  $aConf['video_checker_site'] = home_url();
401
  }
402
  if( $sLogo ) $aConf['logo'] = $sLogo;
403
+
404
+ // Used to restore volume, removed in JS if volume stored in browser localStorage
405
  $aConf['volume'] = floatval( $fv_fp->_get_option('volume') );
406
  if( $aConf['volume'] > 1 ) {
407
  $aConf['volume'] = 1;
408
  }
409
 
410
+ $aConf['default_volume'] = $aConf['volume'];
411
+
412
  if( $val = $fv_fp->_get_option('mobile_native_fullscreen') ) $aConf['mobile_native_fullscreen'] = $val;
413
  if( $val = $fv_fp->_get_option('mobile_force_fullscreen') ) $aConf['mobile_force_fullscreen'] = $val;
414
  if( $val = $fv_fp->_get_option('mobile_alternative_fullscreen') ) $aConf['mobile_alternative_fullscreen'] = $val;
463
  if( $fv_fp->_get_option('chromecast') ) {
464
  $aConf['fv_chromecast'] = $fv_fp->_get_option('chromecast');
465
  }
466
+
467
  if( $fv_fp->_get_option('hd_streaming') ) {
468
  $aConf['hd_streaming'] = true;
469
  }
472
  $aConf['multiple_playback'] = true;
473
  }
474
 
475
+ if( $fv_fp->_get_option('disable_localstorage') ) {
476
+ $aConf['disable_localstorage'] = true;
477
+ }
478
+
479
  $aConf['hlsjs'] = array(
480
  'startLevel' => -1,
481
  'fragLoadingMaxRetry' => 3,
786
 
787
  return version_compare($version,$min ) != -1;
788
  }
789
+
790
+
791
+ /*
792
+ * WP Rocket Used CSS exclusion
793
+ * Since many FV Player features are only visible once the video starts this optimization doesn't work
794
+ */
795
+ add_filter( 'pre_get_rocket_option_remove_unused_css_safelist', 'fv_player_wp_rocket_used_css' );
796
+
797
+ function fv_player_wp_rocket_used_css( $safelist ) {
798
+ // Without this our additions would show on WP Rocket settings page
799
+ global $pagenow;
800
+ if ( 'options-general.php' === $pagenow && 'wprocket' === $_GET['page'] ) {
801
+ return $safelist;
802
+ }
803
+
804
+ $safelist[] = '/wp-content/fv-flowplayer-custom/style-*';
805
+ $safelist[] = '/wp-content/plugins/fv-wordpress-flowplayer*';
806
+ $safelist[] = '/wp-content/plugins/fv-player-*';
807
+ return $safelist;
808
+ }
css/fancybox.css CHANGED
@@ -1,67 +1,66 @@
1
- body.compensate-for-scrollbar{overflow:hidden;-ms-overflow-style:none}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateZ(0);transform:translateZ(0);width:100%;z-index:999992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.87;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:999997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;-webkit-transform:translateZ(0);transform:translateZ(0);z-index:999994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px 44px 0;position:absolute;text-align:center;top:0;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;white-space:normal;width:100%;z-index:999994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--next{z-index:999995}.fancybox-slide--image{padding:44px 0 0;overflow:visible}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px 6px 0}.fancybox-content{background:#fff;display:inline-block;margin:0 0 44px;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{-webkit-animation-timing-function:cubic-bezier(.5,0,.14,1);animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;-webkit-transform-origin:top left;transform-origin:top left;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:999995}.fancybox-slide--html .fancybox-content{margin:0 0 6px}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:-webkit-grab;cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:-webkit-grabbing;cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--video .fancybox-content{height:calc(100% - 44px);overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;vertical-align:top;width:100%}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button.disabled,.fancybox-button.disabled:hover,.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:nth-child(1),.fancybox-button--pause svg:nth-child(1),.fancybox-button--play svg:nth-child(2){display:none}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background:transparent;height:100px;margin:0;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{background:rgba(30,30,30,.6);height:100%;padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0}.fancybox-caption{bottom:0;color:#fff;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:25px 44px;right:0}.fancybox-caption:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAEtCAQAAABjBcL7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHRJREFUKM+Vk8EOgDAIQ0vj/3+xBw8qIZZueFnIKC90MCAI8DlrkHGeqqGIU6lVigrBtpCWqeRWoHDNqs0F7VNVBVxmHRlvoVqjaYkdnDIaivH2HqZ5+oZj3JUzWB+cOz4G48Bg+tsJ/tqu4dLC/4Xb+0GcF5BwBC0AA53qAAAAAElFTkSuQmCC);background-repeat:repeat-x;background-size:contain;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:-25px;z-index:-1}.fancybox-caption:after{border-bottom:1px solid hsla(0,0%,100%,.3);content:"";display:block;left:44px;position:absolute;right:44px;top:0}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{-webkit-animation:a .8s infinite linear;animation:a .8s infinite linear;background:transparent;border:6px solid hsla(0,0%,39%,.5);border-radius:100%;border-top-color:#fff;height:60px;left:50%;margin:-30px 0 0 -30px;opacity:.6;padding:0;position:absolute;top:50%;width:60px;z-index:999999}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;-webkit-transform:scale3d(1.5,1.5,1.5);transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;-webkit-transform:rotate(1turn);transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;-webkit-transform:rotate(0deg);transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;-webkit-transform:scale3d(0,0,0) translate3d(-100%,0,0);transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;-webkit-transform:scale3d(0,0,0) translate3d(100%,0,0);transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;-webkit-transform:scaleX(1) translateZ(0);transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{-webkit-transform:translate3d(-100%,0,0) scale(.1) skew(-10deg);transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{-webkit-transform:translate3d(100%,0,0) scale(.1) skew(10deg);transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{-webkit-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0 0}.fancybox-slide--image .fancybox-content{margin-bottom:6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{background:#fff;bottom:0;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:transparent;top:0;width:212px;z-index:999995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:4px solid #4ea7f9;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:999991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:768px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}}
2
-
3
 
4
  /* Customizations */
5
  .fancybox-content {
6
- overflow: hidden;
7
  }
8
 
9
  .fancybox-content.flowplayer, .fancybox-content.fv_player_lightbox_hidden {
10
- padding: 0;
11
- background-size:contain;
12
- background-repeat:no-repeat;
13
- background-position:center center;
14
  }
15
 
16
  /* Make sure FV Player respects fancybox fullscreen mode */
17
  .fancybox-is-fullscreen .fv_player_lightbox_hidden {
18
- height: 100%;
19
- margin: 0;
20
- padding-bottom: 6px;
21
  }
22
 
23
  /* Proper sizing for mobile landscape view */
24
  .fancybox-slide .flowplayer, .fancybox-slide .fv-playlist-slider-wrapper {
25
- margin-bottom: 0 !important;
26
  }
27
  .fancybox-slide .flowplayer.fixed-controls {
28
- margin-bottom: 2.4em !important;
29
  }
30
  .fancybox-slide .flowplayer.fixed-controls.fp-full {
31
- margin-bottom: 2.8em !important;
32
  }
33
  .fancybox-slide .flowplayer.fixed-controls.has-abloop {
34
- margin-bottom: 5.2em !important;
35
  }
36
 
37
  .fancybox-slide .fv-playlist-slider-wrapper {
38
- margin-top: 1em;
39
  }
40
  .fancybox-is-fullscreen .flowplayer {
41
- max-width: 100% !important;
42
- max-height: 100% !important;
43
- margin: 0 !important;
44
  }
45
  .fancybox-is-fullscreen .flowplayer .fp-fullscreen:before {
46
- content: "\e016"; }
47
  .fancybox-is-fullscreen .flowplayer.fp-outlined .fp-fullscreen:before, .fancybox-is-fullscreen .flowplayer.fp-minimal .fp-fullscreen:before {
48
- content: "\e216"; }
49
  .fancybox-is-fullscreen .flowplayer.fp-edgy .fp-fullscreen:before {
50
- content: "\e116"; }
51
  .fancybox-is-fullscreen .flowplayer.fp-edgy.fp-outlined .fp-fullscreen:before, .fancybox-is-fullscreen .flowplayer.fp-edgy.fp-minimal .fp-fullscreen:before {
52
- content: "\e316"; }
53
 
54
  .fv-player-fancybox-play-icon {
55
- position: absolute;
56
- left: 0;
57
- right: 0;
58
- top: 0;
59
- bottom: 0;
60
- z-index: 999999;
61
- font-size: 40px;
62
- color: white;
63
- text-align: center;
64
- text-shadow: 0px 0px 7px #000;
65
  }
66
 
67
  body.fancybox-active #wpadminbar, body.fancybox-active .nc_wrapper.bottom { display: none !important }
1
+ body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff5268;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:max(0px)){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{animation:a 1s linear infinite;background:transparent;border:4px solid #888;border-bottom-color:#fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@keyframes a{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:max(0px)){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-button--fullscreen:before{width:15px;height:11px;left:calc(50% - 7px);top:calc(50% - 6px);border:2px solid;background:none}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-button--pause:before,.fancybox-button--play:before{top:calc(50% - 6px);left:calc(50% - 4px);background:transparent}.fancybox-button--play:before{width:0;height:0;border-top:6px inset transparent;border-bottom:6px inset transparent;border-left:10px solid;border-radius:1px}.fancybox-button--pause:before{width:7px;height:11px;border-style:solid;border-width:0 2px}.fancybox-thumbs{background:#ddd;bottom:0;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:rgba(0,0,0,0);top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:6px solid #ff5268;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}}
 
2
 
3
  /* Customizations */
4
  .fancybox-content {
5
+ overflow: hidden;
6
  }
7
 
8
  .fancybox-content.flowplayer, .fancybox-content.fv_player_lightbox_hidden {
9
+ padding: 0;
10
+ background-size:contain;
11
+ background-repeat:no-repeat;
12
+ background-position:center center;
13
  }
14
 
15
  /* Make sure FV Player respects fancybox fullscreen mode */
16
  .fancybox-is-fullscreen .fv_player_lightbox_hidden {
17
+ height: 100%;
18
+ margin: 0;
19
+ padding-bottom: 6px;
20
  }
21
 
22
  /* Proper sizing for mobile landscape view */
23
  .fancybox-slide .flowplayer, .fancybox-slide .fv-playlist-slider-wrapper {
24
+ margin-bottom: 0 !important;
25
  }
26
  .fancybox-slide .flowplayer.fixed-controls {
27
+ margin-bottom: 2.4em !important;
28
  }
29
  .fancybox-slide .flowplayer.fixed-controls.fp-full {
30
+ margin-bottom: 2.8em !important;
31
  }
32
  .fancybox-slide .flowplayer.fixed-controls.has-abloop {
33
+ margin-bottom: 5.2em !important;
34
  }
35
 
36
  .fancybox-slide .fv-playlist-slider-wrapper {
37
+ margin-top: 1em;
38
  }
39
  .fancybox-is-fullscreen .flowplayer {
40
+ max-width: 100% !important;
41
+ max-height: 100% !important;
42
+ margin: 0 !important;
43
  }
44
  .fancybox-is-fullscreen .flowplayer .fp-fullscreen:before {
45
+ content: "\e016"; }
46
  .fancybox-is-fullscreen .flowplayer.fp-outlined .fp-fullscreen:before, .fancybox-is-fullscreen .flowplayer.fp-minimal .fp-fullscreen:before {
47
+ content: "\e216"; }
48
  .fancybox-is-fullscreen .flowplayer.fp-edgy .fp-fullscreen:before {
49
+ content: "\e116"; }
50
  .fancybox-is-fullscreen .flowplayer.fp-edgy.fp-outlined .fp-fullscreen:before, .fancybox-is-fullscreen .flowplayer.fp-edgy.fp-minimal .fp-fullscreen:before {
51
+ content: "\e316"; }
52
 
53
  .fv-player-fancybox-play-icon {
54
+ position: absolute;
55
+ left: 0;
56
+ right: 0;
57
+ top: 0;
58
+ bottom: 0;
59
+ z-index: 999999;
60
+ font-size: 40px;
61
+ color: white;
62
+ text-align: center;
63
+ text-shadow: 0px 0px 7px #000;
64
  }
65
 
66
  body.fancybox-active #wpadminbar, body.fancybox-active .nc_wrapper.bottom { display: none !important }
css/flowplayer.css CHANGED
@@ -943,6 +943,9 @@
943
  display: block;
944
  height: 0
945
  }
 
 
 
946
  .flowplayer.is-splash .fp-preload, .flowplayer.is-poster .fp-preload, .fp-waiting .fp-preload {
947
  position: absolute;
948
  display: block;
@@ -964,6 +967,11 @@
964
  .fp-preload b:nth-child(3) { animation-delay: .15s }
965
  .fp-preload b:nth-child(4) { animation-delay: .25s }
966
 
 
 
 
 
 
967
  .flowplayer.is-splash .fp-ui noscript{display:block;z-index: 1000;position: absolute;left:0;right:0;padding:2em;background:black;margin-top:20%}
968
 
969
  .flowplayer .fp-splash,
@@ -2197,10 +2205,19 @@ body.fv_flowplayer_tabs_hide .fv_flowplayer_tabs_content > div.fv_flowplayer_tab
2197
  color: #000;
2198
  }
2199
 
2200
- .flowplayer.is-small .fv-fp-list {display: none}
2201
- .flowplayer.is-tiny .fv-fp-list {display: none}
2202
  .flowplayer .fv-fp-list-menu {width: auto; top:auto}
2203
  .flowplayer .fv-fp-list-menu a {text-align:left}
 
 
 
 
 
 
 
 
 
 
2204
 
2205
  .flowplayer .fp-ui .invisible {
2206
  visibility: hidden;
@@ -2242,11 +2259,36 @@ body.fv_flowplayer_tabs_hide .fv_flowplayer_tabs_content > div.fv_flowplayer_tab
2242
  }
2243
 
2244
  /* Click to unmute */
2245
- .flowplayer .fp-message-muted { text-align: center }
 
2246
  .flowplayer .fp-message-muted:hover, .flowplayer .fp-message-muted:active { text-shadow: 0px 0px 5px rgba( 255, 255, 255, 0.66 ) }
2247
  .flowplayer.has-fp-message-muted .fp-header { display: none }
2248
  .flowplayer .fp-volumebtn-notice { position: relative; top: 3px; }
2249
  .flowplayer .fp-volumebtn-notice:before { content: "\e00d"; }
2250
  .flowplayer.fp-outlined .fp-volumebtn-notice:before, .flowplayer.fp-minimal .fp-volumebtn-notice:before { content: "\e20d"; }
2251
  .flowplayer.fp-edgy .fp-volumebtn-notice:before { content: "\e10d"; }
2252
- .flowplayer.fp-edgy.fp-outlined .fp-volumebtn-notice:before, .flowplayer.fp-edgy.fp-minimal .fp-volumebtn-notice:before { content: "\e30d"; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
943
  display: block;
944
  height: 0
945
  }
946
+ .flowplayer .fp-ui .fp-preload {
947
+ margin: auto;
948
+ }
949
  .flowplayer.is-splash .fp-preload, .flowplayer.is-poster .fp-preload, .fp-waiting .fp-preload {
950
  position: absolute;
951
  display: block;
967
  .fp-preload b:nth-child(3) { animation-delay: .15s }
968
  .fp-preload b:nth-child(4) { animation-delay: .25s }
969
 
970
+ .flowplayer .fp-bar > *.fp-buffer, .flowplayer .fp-bar-slider > *.fp-buffer {
971
+ max-width: 100%; }
972
+ .flowplayer.is-live .fp-buffer {
973
+ display: none; }
974
+
975
  .flowplayer.is-splash .fp-ui noscript{display:block;z-index: 1000;position: absolute;left:0;right:0;padding:2em;background:black;margin-top:20%}
976
 
977
  .flowplayer .fp-splash,
2205
  color: #000;
2206
  }
2207
 
2208
+ .flowplayer.is-small .fv-fp-list, .flowplayer.is-tiny .fv-fp-list {display: none}
 
2209
  .flowplayer .fv-fp-list-menu {width: auto; top:auto}
2210
  .flowplayer .fv-fp-list-menu a {text-align:left}
2211
+ .flowplayer .fv-fp-list-name {display: none}
2212
+
2213
+ .flowplayer .fv-fp-list-name {
2214
+ display: none;
2215
+ width: 8em;
2216
+ text-overflow: ellipsis;
2217
+ white-space: nowrap;
2218
+ overflow: hidden;
2219
+ }
2220
+ .flowplayer.is-small .fv-fp-list-name, .flowplayer.is-tiny .fv-fp-list-name {display: none}
2221
 
2222
  .flowplayer .fp-ui .invisible {
2223
  visibility: hidden;
2259
  }
2260
 
2261
  /* Click to unmute */
2262
+ .flowplayer .fp-message-muted { opacity: 0; text-align: center }
2263
+ .flowplayer.is-mouse-over .fp-message-muted { opacity: 1 }
2264
  .flowplayer .fp-message-muted:hover, .flowplayer .fp-message-muted:active { text-shadow: 0px 0px 5px rgba( 255, 255, 255, 0.66 ) }
2265
  .flowplayer.has-fp-message-muted .fp-header { display: none }
2266
  .flowplayer .fp-volumebtn-notice { position: relative; top: 3px; }
2267
  .flowplayer .fp-volumebtn-notice:before { content: "\e00d"; }
2268
  .flowplayer.fp-outlined .fp-volumebtn-notice:before, .flowplayer.fp-minimal .fp-volumebtn-notice:before { content: "\e20d"; }
2269
  .flowplayer.fp-edgy .fp-volumebtn-notice:before { content: "\e10d"; }
2270
+ .flowplayer.fp-edgy.fp-outlined .fp-volumebtn-notice:before, .flowplayer.fp-edgy.fp-minimal .fp-volumebtn-notice:before { content: "\e30d"; }
2271
+
2272
+ /* Videos pending encoding */
2273
+ .fv-player-encoder-video-processing-modal {
2274
+ text-align: center;
2275
+ z-index: 1000;
2276
+ position: absolute;
2277
+ width: 100%;
2278
+ height: 100%;
2279
+ background-color: black;
2280
+ color: white;
2281
+ top: 0;
2282
+ }
2283
+ .fv-player-encoder-video-processing-modal.hidden {
2284
+ display: none;
2285
+ }
2286
+ .fv-player-encoder-video-processing-modal h2 {
2287
+ font-weight: bold;
2288
+ color: white;
2289
+ padding-top: 35px;
2290
+ }
2291
+ .flowplayer .fv-player-encoder-video-processing-modal p {
2292
+ width: 100%;
2293
+ max-width: 100%;
2294
+ }
css/s3-uploader.css CHANGED
@@ -2,27 +2,28 @@
2
  padding-top: 20px;
3
  }
4
 
5
- .upload_buttons .fv-player-s3-upload-cancel-btn, .upload_buttons .fv-player-s3-upload-file-input {
6
  display: none;
7
  }
8
 
9
- .fv-player-s3-upload-buttons {
10
  float: left;
11
  }
12
- .fv-player-s3-upload-progress,
13
- .fv-player-s3-upload-wrap {
14
  float: right;
15
  }
16
 
17
- .fv-player-s3-upload-buttons .button {
18
  margin-top: -5px;
19
  }
20
 
21
- .fv-player-s3-upload-buttons input, .fv-player-s3-upload-buttons .button, .fv-player-s3-upload-progress-enclosure {
 
22
  margin-right: 10px;
23
  }
24
 
25
- .fv-player-s3-upload-progress-enclosure {
26
  display: none;
27
  position:relative;
28
  height: 23px;
@@ -36,7 +37,7 @@
36
  box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
37
  }
38
 
39
- .fv-player-s3-upload-progress-number {
40
  position: absolute;
41
  left: 50%;
42
  top: 2px;
@@ -44,7 +45,7 @@
44
  color: black;
45
  }
46
 
47
- .fv-player-s3-upload-progress-bar {
48
  float: left;
49
  width: 0;
50
  height: 100%;
2
  padding-top: 20px;
3
  }
4
 
5
+ .upload_buttons .fv-player-s3-upload-cancel-btn, .upload_buttons .fv-player-s3-upload-file-input, .upload_buttons input[type="file"] {
6
  display: none;
7
  }
8
 
9
+ .fv-player-s3-upload-buttons, .fv-player-upload-buttons {
10
  float: left;
11
  }
12
+ .fv-player-s3-upload-progress, .fv-player-upload-progress,
13
+ .fv-player-s3-upload-wrap, .fv-player-upload-wrap {
14
  float: right;
15
  }
16
 
17
+ .fv-player-s3-upload-buttons .button, .fv-player-upload-buttons .button {
18
  margin-top: -5px;
19
  }
20
 
21
+ .fv-player-s3-upload-buttons input, .fv-player-s3-upload-buttons .button, .fv-player-s3-upload-progress-enclosure,
22
+ .fv-player-upload-buttons input, .fv-player-upload-buttons .button, .fv-player-upload-progress-enclosure {
23
  margin-right: 10px;
24
  }
25
 
26
+ .fv-player-s3-upload-progress-enclosure, .fv-player-upload-progress-enclosure {
27
  display: none;
28
  position:relative;
29
  height: 23px;
37
  box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
38
  }
39
 
40
+ .fv-player-s3-upload-progress-number, .fv-player-upload-progress-number {
41
  position: absolute;
42
  left: 50%;
43
  top: 2px;
45
  color: black;
46
  }
47
 
48
+ .fv-player-s3-upload-progress-bar, .fv-player-upload-progress-bar {
49
  float: left;
50
  width: 0;
51
  height: 100%;
flowplayer.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: FV Player
4
  Plugin URI: http://foliovision.com/wordpress/plugins/fv-wordpress-flowplayer
5
  Description: Formerly FV WordPress Flowplayer. Supports MP4, HLS, MPEG-DASH, WebM and OGV. Advanced features such as overlay ads or popups. Uses Flowplayer 7.2.7.
6
- Version: 7.5.10.727
7
  Author URI: http://foliovision.com/
8
  License: GPL-3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.txt
@@ -27,7 +27,7 @@ License URI: http://www.gnu.org/licenses/gpl-3.0.txt
27
  */
28
 
29
  global $fv_wp_flowplayer_ver;
30
- $fv_wp_flowplayer_ver = '7.5.10.727.2';
31
  $fv_wp_flowplayer_core_ver = '7.2.7.2';
32
  include_once( dirname( __FILE__ ) . '/includes/extra-functions.php' );
33
  if( file_exists( dirname( __FILE__ ) . '/includes/module.php' ) ) {
@@ -68,6 +68,7 @@ include_once(dirname( __FILE__ ) . '/models/db.php');
68
 
69
  include_once(dirname( __FILE__ ).'/models/cdn.class.php');
70
  include_once(dirname( __FILE__ ).'/models/digitalocean-spaces.class.php');
 
71
 
72
  global $FV_Player_Db;
73
  $FV_Player_Db = new FV_Player_Db();
3
  Plugin Name: FV Player
4
  Plugin URI: http://foliovision.com/wordpress/plugins/fv-wordpress-flowplayer
5
  Description: Formerly FV WordPress Flowplayer. Supports MP4, HLS, MPEG-DASH, WebM and OGV. Advanced features such as overlay ads or popups. Uses Flowplayer 7.2.7.
6
+ Version: 7.5.12.727
7
  Author URI: http://foliovision.com/
8
  License: GPL-3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.txt
27
  */
28
 
29
  global $fv_wp_flowplayer_ver;
30
+ $fv_wp_flowplayer_ver = '7.5.12.727.2';
31
  $fv_wp_flowplayer_core_ver = '7.2.7.2';
32
  include_once( dirname( __FILE__ ) . '/includes/extra-functions.php' );
33
  if( file_exists( dirname( __FILE__ ) . '/includes/module.php' ) ) {
68
 
69
  include_once(dirname( __FILE__ ).'/models/cdn.class.php');
70
  include_once(dirname( __FILE__ ).'/models/digitalocean-spaces.class.php');
71
+ include_once(dirname( __FILE__ ).'/models/linode-object-storage.class.php');
72
 
73
  global $FV_Player_Db;
74
  $FV_Player_Db = new FV_Player_Db();
flowplayer/fv-player.min.js CHANGED
@@ -1 +1 @@
1
- if(typeof fv_flowplayer_conf!="undefined"){try{if(typeof window.localStorage=="object"&&typeof window.localStorage.volume!="undefined"){delete fv_flowplayer_conf.volume}}catch(e){}flowplayer.conf=fv_flowplayer_conf;flowplayer.conf.fullscreen=false;flowplayer.conf.chromecast=false;flowplayer.conf.embed=false;flowplayer.conf.share=false;flowplayer.conf.analytics=false;try{flowplayer.conf.key=atob(flowplayer.conf.key)}catch(e){}if(!flowplayer.support.android&&flowplayer.conf.dacast_hlsjs){function FVAbrController(hls){this.hls=hls;this.nextAutoLevel=3}FVAbrController.prototype.nextAutoLevel=function(nextLevel){this.nextAutoLevel=nextLevel};FVAbrController.prototype.destroy=function(){};flowplayer.conf.hlsjs={startLevel:-1,abrController:FVAbrController}}function parseIOSVersion(UA){var e=/iP(ad|hone)(; CPU)? OS (\d+_\d)/.exec(UA);if(e&&e.length>1){return parseFloat(e[e.length-1].replace("_","."),10)}return 0}if(flowplayer.support.iOS&&flowplayer.support.iOS.chrome&&flowplayer.support.iOS.version==0){flowplayer.support.iOS.version=parseIOSVersion(navigator.userAgent)}if(flowplayer.support.iOS&&parseInt(flowplayer.support.iOS.version)>=13||!flowplayer.support.iOS&&flowplayer.support.browser.safari&&parseInt(flowplayer.support.browser.version)>=8){flowplayer.conf.hlsjs.safari=true}flowplayer.support.fvmobile=!!(!flowplayer.support.firstframe||flowplayer.support.iOS||flowplayer.support.android);var fls=flowplayer.support;if(flowplayer.conf.mobile_native_fullscreen&&"ontouchstart"in window&&fls.fvmobile){flowplayer.conf.native_fullscreen=true}if("ontouchstart"in window){if(fls.android&&fls.android.version<4.4&&!(fls.browser.chrome&&fls.browser.version>54)){flowplayer.conf.native_fullscreen=true}if(fls.iOS&&(fv_player_in_iframe()||fls.iOS.version<7)){flowplayer.conf.native_fullscreen=true}}}if(typeof fv_flowplayer_translations!="undefined"){flowplayer.defaults.errors=fv_flowplayer_translations}var fv_player_did_autoplay=false;function fv_player_videos_parse(args,root){try{var videos=JSON.parse(args)}catch(e){return false}var regex=new RegExp("[\\?&]fv_flowplayer_mobile=([^&#]*)");var results=regex.exec(location.search);if((results!=null&&results[1]=="yes"||(jQuery(window).width()<=480||jQuery(window).height()<=480))&&(results==null||results[1]!="no")){var fv_fp_mobile=false;jQuery(videos.sources).each(function(k,v){if(v.mobile){videos.sources[k]=videos.sources[0];videos.sources[0]=v;fv_fp_mobile=true}if(fv_fp_mobile){jQuery(root).after('<p class="fv-flowplayer-mobile-switch">'+fv_flowplayer_translations.mobile_browser_detected_1+' <a href="'+document.URL+'?fv_flowplayer_mobile=no">'+fv_flowplayer_translations.mobile_browser_detected_2+"</a>.</p>")}})}root.trigger("fv_player_videos_parse",videos);return videos}function fv_player_in_iframe(){try{return window.self!==window.top}catch(e){return true}}jQuery(document).ready(function(){var loading_count=0;var loading=setInterval(function(){loading_count++;if(loading_count<1e3&&(window.fv_video_intelligence_conf&&!window.FV_Player_IMA||window.fv_vast_conf&&!window.FV_Player_IMA||window.fv_player_pro&&!window.FV_Flowplayer_Pro&&document.getElementById("fv_player_pro")!=fv_player_pro||window.fv_player_user_playlists&&!fv_player_user_playlists.is_loaded||window.FV_Player_JS_Loader_scripts_total&&window.FV_Player_JS_Loader_scripts_loaded<FV_Player_JS_Loader_scripts_total)){return}clearInterval(loading);fv_player_preload()},10)});function fv_escape_attr(text){var map={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return text.replace(/[&<>"']/g,function(m){return map[m]})}function fv_player_preload(){if(flowplayer.support.touch){jQuery(".fp-playlist-external.fv-playlist-design-2017").addClass("visible-captions")}flowplayer(function(api,root){if(localStorage.flowplayerTestStorage){delete localStorage.flowplayerTestStorage}root=jQuery(root);var fp_player=root.find(".fp-player");var splash_click=false;if(root.hasClass("fixed-controls")){root.find(".fp-controls").on("click",function(e){if(!api.loading&&!api.ready){e.preventDefault();e.stopPropagation();api.load()}})}if(!flowplayer.support.volume&&!flowplayer.support.autoplay){root.find(".fp-volume").hide()}if(root.data("volume")==0&&root.hasClass("no-controlbar")){root.find(".fp-volume").remove()}var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]");if((!api.conf.playlist||api.conf.playlist.length==0)&&playlist.length&&playlist.find("a[data-item]").length>0){var items=[];playlist.find("a[data-item]").each(function(){if(parsed=fv_player_videos_parse(jQuery(this).attr("data-item"),root)){items.push(parsed)}else{jQuery(this).remove()}});api.conf.playlist=items;api.conf.clip=items[0]}else if(!api.conf.clip){api.conf.clip=fv_player_videos_parse(jQuery(root).attr("data-item"),root)}jQuery("a",playlist).on("click",function(e){e.preventDefault();splash_click=true;var $this=jQuery(this),playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]"),index=jQuery("a",playlist).index(this);$prev=$this.prev("a"),item=$this.data("item");if(location.href.match(/wp-admin/)&&$this.parents(".fv-player-editor-preview").length>0){fv_flowplayer_conf.current_video_to_edit=index;$this.parents(".fv-player-custom-video").find(".edit-video .fv-player-editor-button").trigger("click");return false}if($prev.length&&$this.is(":visible")&&!$prev.is(":visible")){$prev.trigger("click");return false}if(jQuery("#"+$this.parent().attr("rel")).hasClass("dynamic-playlist"))return;var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]");fv_player_playlist_active(playlist,this);if(api){if(api.error){api.pause();api.error=api.loading=false;root.removeClass("is-error");root.find(".fp-message.fp-shown").remove()}if(!api.video||api.video.index==index)return;api.play(index)}var new_splash=item.splash;if(!new_splash){new_splash=$this.find("img").attr("src")}player_splash(root,fp_player,item,new_splash);var rect=root[0].getBoundingClientRect();if(rect.bottom-100<0){jQuery("html, body").animate({scrollTop:jQuery(root).offset().top-100},300)}});var playlist_external=jQuery("[rel="+root.attr("id")+"]");var playlist_progress=false;var splash_img=root.find(".fp-splash");var splash_text=root.find(".fv-fp-splash-text");function player_splash(root,fp_player,item,new_splash){var splash_img=root.find("img.fp-splash");if(new_splash){if(splash_img.length==0){splash_img=jQuery('<img class="fp-splash" />');fp_player.prepend(splash_img)}splash_img.attr("alt",item.fv_title?fv_escape_attr(item.fv_title):"video");splash_img.attr("src",new_splash)}else if(splash_img.length){splash_img.remove()}}api.bind("load",function(e,api,video){if(!api.conf.playlist.length){return}if(video.type.match(/^audio/)&&!splash_click){var anchor=playlist_external.find("a").eq(video.index);var item=anchor.data("item");var new_splash=item.splash;if(!new_splash){new_splash=anchor.find("img").attr("src")}player_splash(root,fp_player,item,new_splash)}splash_click=false});api.bind("ready",function(e,api,video){setTimeout(function(){if(video.index>-1){if(playlist_external.length>0){var playlist_item=jQuery("a",playlist_external).eq(video.index);fv_player_playlist_active(playlist_external,playlist_item);playlist_progress=playlist_item.find(".fvp-progress")}}},100);splash_img=root.find(".fp-splash");if(!video.is_audio_stream&&!video.type.match(/^audio/)){splash_img.remove();splash_text.remove()}});api.bind("unload",function(){jQuery(".fp-playlist-external .now-playing").remove();jQuery(".fp-playlist-external a").removeClass("is-active");var iframe=fp_player.find("iframe.fp-engine");if(iframe.length){iframe.after(splash_text);iframe.after(splash_img)}else{fp_player.prepend(splash_text);fp_player.prepend(splash_img)}playlist_progress=false});api.bind("progress",function(e,api,time){if(playlist_progress.length){api.playlist_thumbnail_progress(playlist_progress,api.video,time)}});api.bind("error-subtitles",function(){console.log("error-subtitles");fv_player_notice(root,fv_flowplayer_translations[8],2e3)});var playlist=jQuery(root).parent().find("div.fp-playlist-vertical[rel="+jQuery(root).attr("id")+"]");if(playlist.length){function check_size_and_all(args){var property=playlist.hasClass("fp-playlist-only-captions")?"height":"max-height";if(playlist.parents(".fp-playlist-text-wrapper").hasClass("is-fv-narrow")){property="max-height"}playlist.css(property,vertical_playlist_height());if(property=="max-height")playlist.css("height","auto")}check_size_and_all();jQuery(window).on("resize tabsactivate",function(){setTimeout(check_size_and_all,0)})}function vertical_playlist_height(args){var height=root.height();if(height==0)height=root.css("max-height");return height}api.show_status=function(type){var status="";["loading","ready","playing","paused","seeking"].every(function(v,k){if(api[v])status+=" "+v;return true});console.log("FV Player Status ("+type+")",status)};if(!window.fv_player_loaded){window.fv_player_loaded=true;setTimeout(function(){jQuery(document).trigger("fv_player_loaded");var event=new CustomEvent("fv_player_loaded",[]);document.dispatchEvent(event)},100)}setTimeout(function(){root.trigger("fv_player_loaded")},10)});if(window.self!=window.top&&!location.href.match(/fv_player_preview/)){embed_size();jQuery(window.self).resize(embed_size)}function embed_size(){jQuery(".flowplayer.fp-is-embed").each(function(){var root=jQuery(this);if(!root.hasClass("has-chapters")&&!root.hasClass("has-transcript")&&jQuery(".fp-playlist-external[rel="+root.attr("id")+"]").length==0){root.height(jQuery(window).height())}})}if(typeof fv_flowplayer_playlists!="undefined"){for(var i in fv_flowplayer_playlists){if(!fv_flowplayer_playlists.hasOwnProperty(i))continue;jQuery("#"+i).flowplayer({playlist:fv_flowplayer_playlists[i]})}}fv_player_load();fv_autoplay_exec();jQuery(document).ajaxComplete(function(){fv_player_load()});jQuery(window).on("hashchange",fv_autoplay_exec)}function fv_player_load(forced_el){if(forced_el&&forced_el.lenght>1){console.log("FV Player: Can't use fv_player_load with more than a single forced element!")}var load_players=forced_el,forced_api=false;if(!load_players)load_players=jQuery(".flowplayer");load_players.each(function(i,el){var root=jQuery(el);var api=root.data("flowplayer");if(api){if(forced_el)forced_api=api;return}if(forced_el){root.find(".fp-preload, .fvfp_admin_error").remove();if(root.attr("data-item-lazy")){root.attr("data-item",root.attr("data-item-lazy"));root.removeAttr("item-lazy")}else if(playlist=jQuery("[rel="+root.attr("id")+"]")){playlist.find("a[data-item-lazy]").each(function(k,v){v=jQuery(v);v.attr("data-item",v.attr("data-item-lazy"));v.removeAttr("data-item-lazy")})}}var conf=false;if(root.attr("data-item")){conf={clip:fv_player_videos_parse(root.attr("data-item"),root)}}else if(playlist=jQuery("[rel="+root.attr("id")+"]")){if(playlist.find("a[data-item]").length==0)return;var items=[];playlist.find("a[data-item]").each(function(){if(parsed=fv_player_videos_parse(jQuery(this).attr("data-item"),root)){items.push(parsed)}else{jQuery(this).remove()}});conf={playlist:items}}if(conf){conf=flowplayer.extend(conf,root.data());forced_api=flowplayer(root[0],conf);root.data("flowplayer",forced_api)}});jQuery(".fv-playlist-slider-wrapper").each(function(i,el){var items=jQuery(this).find("a");jQuery(this).find(".fp-playlist-external").css("width",items.outerWidth()*items.length)});if(typeof jQuery().tabs!="undefined"){jQuery("body").removeClass("fv_flowplayer_tabs_hide");jQuery(".fv_flowplayer_tabs_content").tabs()}if(forced_el&&forced_api){return forced_api}}function fv_player_playlist_active(playlist,item){if(playlist){jQuery("a",playlist).removeClass("is-active");jQuery(".now-playing").remove()}$playlist=jQuery(playlist);$item=jQuery(item);var scroll_parent=false;$item.addClass("is-active");var is_design_2014=$playlist.hasClass("fv-playlist-design-2014");if((is_design_2014&&$item.find("h4").length==0||!is_design_2014)&&$item.find(".now-playing").length==0)$item.prepend('<strong class="now-playing"><span>'+fv_flowplayer_translations.playlist_current+"</span></strong>");if(!$playlist.parent().find(".flowplayer").length){scroll_parent=true}if(($playlist.hasClass("fp-playlist-vertical")||$playlist.hasClass("fp-playlist-horizontal")&&$playlist.hasClass("is-audio"))&&!fullyVisibleY($item.get(0))){var $el=scroll_parent?$playlist.parent():$playlist;$el.animate({scrollTop:$el.scrollTop()+($item.position().top-$el.position().top)},750)}else if($playlist.hasClass("fp-playlist-horizontal")&&!fullyVisibleX($item.get(0))){var $el=scroll_parent?$playlist.parent():$playlist;$el.animate({scrollLeft:$el.scrollLeft()+($item.position().left-$el.position().left)},750)}function fullyVisibleY(el){var rect=el.getBoundingClientRect(),top=rect.top,height=rect.height,bottom=top+height,el=el.parentNode;do{rect=el.getBoundingClientRect();if(bottom<=rect.bottom===false)return false;if(top<=rect.top)return false;el=el.parentNode}while(el!=document.body);return bottom<=document.documentElement.clientHeight}function fullyVisibleX(el){var rect=el.getBoundingClientRect(),left=rect.left,width=rect.width,right=left+width,el=el.parentNode;do{rect=el.getBoundingClientRect();if(right<=rect.right===false)return false;if(left<=rect.left)return false;el=el.parentNode}while(el!=document.body);return right<=document.documentElement.clientWidth}}var fv_fp_date=new Date;var fv_fp_utime=fv_fp_date.getTime();function fv_parse_sharelink(src){src=src.replace("https?://[^./].","");var prefix="fvp_";if(src.match(/(youtube.com)/)){return prefix+src.match(/(?:v=)([A-Za-z0-9_-]*)/)[1]}else if(src.match(/(vimeo.com)|(youtu.be)/)){return prefix+src.match(/(?:\/)([^/]*$)/)[1]}else{var match=src.match(/(?:\/)([^/]*$)/);if(match){return prefix+match[1].match(/^[^.]*/)[0]}}return prefix+src}function fv_player_get_video_link_hash(api){var hash=fv_parse_sharelink(typeof api.video.sources_original!="undefined"&&typeof api.video.sources_original[0]!="undefined"?api.video.sources_original[0].src:api.video.sources[0].src);if(typeof api.video.id!="undefined"){hash=fv_parse_sharelink(api.video.id.toString())}return hash}function fv_player_time_hms(seconds){if(isNaN(seconds)){return NaN}var sec_num=parseInt(seconds,10);var hours=Math.floor(sec_num/3600);var minutes=Math.floor(sec_num/60)%60;var seconds=sec_num%60;if(hours){hours+="h"}else{hours=""}if(hours&&minutes<10){minutes="0"+minutes+"m"}else if(!hours&&minutes){minutes+="m"}else{minutes=""}if((hours||minutes)&&seconds<10){seconds="0"+seconds}seconds+="s";var timeString=hours+minutes+seconds;return timeString}function fv_player_time_hms_ms(seconds){if(isNaN(seconds)){return NaN}seconds=parseFloat(seconds).toFixed(3);var miliseconds=(seconds+"").split(".");if(typeof miliseconds[1]!="undefined"&&miliseconds[1]>0){miliseconds=miliseconds[1]+"ms"}else{miliseconds=""}var timeString=fv_player_time_hms(seconds)+miliseconds;return timeString}function fv_player_time_seconds(time,duration){if(!time)return-1;var seconds=0;var match=time.match(/(\d+[a-z]{1,2})/g);match.forEach(function(item){if(item.endsWith("h")){seconds+=3600*parseInt(item)}else if(item.endsWith("m")){seconds+=60*parseInt(item)}else if(item.endsWith("s")&&!item.endsWith("ms")){seconds+=parseInt(item)}else if(item.endsWith("ms")){if(parseInt(item)){seconds+=parseInt(item)/1e3}}});return duration?Math.min(seconds,duration):seconds}function fv_autoplay_init(root,index,time,abStart,abEnd){if(fv_autoplay_exec_in_progress)return;fv_autoplay_exec_in_progress=true;var api=root.data("flowplayer");if(!api)return;var fTime=fv_player_time_seconds(time);abEnd=fv_player_time_seconds(abEnd);abStart=fv_player_time_seconds(abStart);if(root.parent().hasClass("ui-tabs-panel")){var tabId=root.parent().attr("id");jQuery("[aria-controls="+tabId+"] a").trigger("click")}if(!root.find(".fp-player").attr("class").match(/\bis-sticky/)){var offset=jQuery(root).offset().top-(jQuery(window).height()-jQuery(root).height())/2;window.scrollTo(0,offset);api.one("ready",function(){window.scrollTo(0,offset)})}if(root.hasClass("lightboxed")){setTimeout(function(){jQuery("[href=\\#"+root.attr("id")+"]").trigger("click")},0)}if(index){if(fv_player_video_link_autoplay_can(api,parseInt(index))){if(api.ready){fv_player_video_link_seek(api,fTime)}else{api.play(parseInt(index));api.one("ready",function(){fv_player_video_link_seek(api,fTime,abEnd,abStart)})}}else if(flowplayer.support.inlineVideo){api.one(api.playing?"progress":"ready",function(e,api){api.play(parseInt(index));api.one("ready",function(){fv_player_video_link_seek(api,fTime,abEnd,abStart)})});root.find(".fp-splash").attr("src",jQuery("[rel="+root.attr("id")+"] div").eq(index).find("img").attr("src"));if(!fv_player_in_iframe()){fv_player_notice(root,fv_flowplayer_translations[11],"progress")}}}else{if(api.ready){fv_player_video_link_seek(api,fTime)}else{if(fv_player_video_link_autoplay_can(api)){api.load()}else if(!fv_player_in_iframe()){fv_player_notice(root,fv_flowplayer_translations[11],"progress")}api.one("ready",function(){fv_player_video_link_seek(api,fTime,abEnd,abStart)})}}}function fv_player_video_link_seek(api,fTime,abEnd,abStart){fv_autoplay_exec_in_progress=false;var do_seek=setInterval(function(){if(api.loading)return;if(fTime>0||api.video.time>0){if(!!api.custom_seek){api.custom_seek(fTime)}else{api.seek(fTime)}}if(abEnd&&abStart)api.trigger("link-ab",[api,abStart,abEnd]);clearInterval(do_seek)},10)}var fv_autoplay_exec_in_progress=false;function fv_autoplay_exec(){var autoplay=true;if(typeof flowplayer!=="undefined"&&typeof fv_flowplayer_conf!="undefined"&&fv_flowplayer_conf.video_hash_links&&window.location.hash.substring(1).length){var aHash=window.location.hash.match(/\?t=/)?window.location.hash.substring(1).split("?t="):window.location.hash.substring(1).split(",");var hash=aHash[0];var time=aHash[1]===undefined?false:aHash[1];var abStart=aHash[2]===undefined?false:aHash[2];var abEnd=aHash[3]===undefined?false:aHash[3];jQuery(".flowplayer").each(function(){var root=jQuery(this);if(root.hasClass("lightbox-starter")){root=jQuery(root.attr("href"))}var api=root.data("flowplayer");if(!api)return;var playlist=typeof api.conf.playlist!=="undefined"&&api.conf.playlist.length>1?api.conf.playlist:[api.conf.clip];for(var item in playlist){if(!playlist.hasOwnProperty(item))continue;var id=typeof playlist[item].id!=="undefined"?fv_parse_sharelink(playlist[item].id.toString()):false;if(hash===id&&autoplay){console.log("fv_autoplay_exec for "+id,item);fv_autoplay_init(root,parseInt(item),time,abStart,abEnd);autoplay=false;return false}}for(var item in playlist){if(!playlist.hasOwnProperty(item))continue;var src=fv_parse_sharelink(playlist[item].sources[0].src);if(hash===src&&autoplay){console.log("fv_autoplay_exec for "+src,item);fv_autoplay_init(root,parseInt(item),time,abStart,abEnd);autoplay=false;return false}}})}if(autoplay&&flowplayer.support.firstframe){jQuery(".flowplayer[data-fvautoplay]").each(function(){var root=jQuery(this),api=root.data("flowplayer"),autoplay=root.attr("data-fvautoplay");if(!fv_player_did_autoplay&&autoplay){if((flowplayer.support.android||flowplayer.support.iOS)&&api&&api.conf.clip.sources[0].type=="video/youtube"){console.log("FV Player: Autoplay for YouTube not supported on Android and iOS");return}else{fv_player_did_autoplay=true;if(api.conf.playlist.length&&jQuery.isNumeric(autoplay)){api.play(parseInt(autoplay))}else{api.load()}var play_icon=root.find(".fp-play").addClass("invisible"),control_bar=root.find(".fp-controls").addClass("invisible");api.one("progress",function(){play_icon.removeClass("invisible");control_bar.removeClass("invisible")});if(autoplay=="muted"){api.mute(true,true)}}}})}}function fv_player_video_link_autoplay_can(api,item){var video=item?api.conf.playlist[item]:api.conf.clip;if(video.sources[0].type=="video/youtube"&&(flowplayer.support.iOS||flowplayer.support.android)||fv_player_in_iframe())return false;return flowplayer.support.firstframe}function fv_player_notice(root,message,timeout){var notices=jQuery(".fvfp-notices",root);if(!notices.length){notices=jQuery('<div class="fvfp-notices">');jQuery(".fp-player",root).append(notices)}var notice=jQuery('<div class="fvfp-notice-content">'+message+"</div></div>");notices.append(notice);if(typeof timeout=="string"){var player=jQuery(root).data("flowplayer");player.on(timeout,function(){notice.fadeOut(100,function(){jQuery(this).remove()})})}if(timeout>0){setTimeout(function(){notice.fadeOut(2e3,function(){jQuery(this).remove()})},timeout)}return notice}var fv_player_clipboard=function(text,successCallback,errorCallback){try{fv_player_doCopy(text);successCallback()}catch(e){if(typeof errorCallback!="undefined")errorCallback(e)}};function fv_player_doCopy(text){var textarea=document.createElement("textarea");textarea.value=text;textarea.style.opacity=0;textarea.style.position="absolute";textarea.setAttribute("readonly",true);document.body.appendChild(textarea);var selected=document.getSelection().rangeCount>0?document.getSelection().getRangeAt(0):false;if(navigator.userAgent.match(/ipad|ipod|iphone/i)){var editable=textarea.contentEditable;textarea.contentEditable=true;var range=document.createRange();range.selectNodeContents(textarea);var sel=window.getSelection();sel.removeAllRanges();sel.addRange(range);textarea.setSelectionRange(0,999999);textarea.contentEditable=editable}else{textarea.select()}try{var result=document.execCommand("copy");if(selected){document.getSelection().removeAllRanges();document.getSelection().addRange(selected)}document.body.removeChild(textarea);return result}catch(err){throw new Error("Unsuccessfull")}}flowplayer(function(api,root){root=jQuery(root);var hlsjs;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls;hlsjs.on(Hls.Events.ERROR,function(event,data){if(data.type=="mediaError"&&data.details=="fragParsingError"&&data.fatal==true){hlsjs.destroy();api.trigger("error",[api,{code:3}]);setTimeout(function(){root.removeClass("is-seeking");root.addClass("is-paused")},0)}});if(flowplayer.support.browser.safari){hlsjs.on(Hls.Events.KEY_LOADED,function(event){if(event=="hlsKeyLoaded"){setTimeout(function(){if(api.loading){console.log("FV Player: Safari stuck loading HLS, resuming playback...");api.resume()}},0)}})}var pick_quality=flowplayer.conf.hd_streaming&&!flowplayer.support.fvmobile?720:false;if(jQuery(params.root).data("hd_streaming")==false)pick_quality=false;if(localStorage.FVPlayerHLSQuality)pick_quality=localStorage.FVPlayerHLSQuality;if(pick_quality){hlsjs.on(Hls.Events.MANIFEST_PARSED,function(_,data){var found=false;jQuery.each(data.levels,function(k,v){if(v.height==pick_quality)found=k});if(!localStorage.FVPlayerHLSQuality&&!found){jQuery.each(data.levels,function(k,v){if(v.height>found)found=k})}if(found){console.log("FV Player: Picked "+data.levels[found].height+"p quality");hlsjs.startLevel=found;hlsjs.currentLevel=found}})}});root=jQuery(root);var search=document.location.search;if(localStorage.FVPlayerDashQuality){if(!api.conf.dash)api.conf.dash={};api.conf.dash.initialVideoQuality="restore"}root.on("click",".fp-qsel-menu a",function(){if(api.engine.engineName=="hlsjs-lite"){var quality=jQuery(this).data("quality");if(quality==-1){localStorage.removeItem("FVPlayerHLSQuality")}else{var level=hlsjs.levels[quality];localStorage.FVPlayerHLSQuality=level.height}}});if(localStorage.FVPlayerHLSQuality){api.conf.hlsjs.startLevel=parseInt(localStorage.FVPlayerHLSQuality);api.conf.hlsjs.testBandwidth=false;api.conf.hlsjs.autoLevelEnabled=false}else if(flowplayer.conf.hd_streaming&&!flowplayer.support.fvmobile){api.conf.hlsjs.startLevel=3;api.conf.hlsjs.testBandwidth=false;api.conf.hlsjs.autoLevelEnabled=false}api.bind("quality",function(e,api,quality){if(api.engine.engineName=="dash"){if(quality==-1){localStorage.removeItem("FVPlayerDashQuality")}else if(bitrates[quality]){localStorage.FVPlayerDashQuality=bitrates[quality].height}}});var bitrates=[];var last_quality=-1;api.bind("ready",function(e,api){root.find(".fp-qsel-menu strong").text(fv_flowplayer_translations.quality);if(api.engine.engineName=="dash"){bitrates=api.engine.dash.getBitrateInfoListFor("video");if(localStorage.FVPlayerDashQuality&&api.conf.dash.initialVideoQuality){api.quality(api.conf.dash.initialVideoQuality)}quality_sort()}else if(api.engine.engineName=="hlsjs-lite"){root.addClass("is-loading");api.loading=true;api.one("progress",function(){if(api.loading){root.removeClass("is-loading");api.loading=false}});if(api.video.qualities&&api.video.qualities.length>2){var qswitch=-1;if(localStorage.FVPlayerHLSQuality){jQuery(api.video.qualities).each(function(k,v){if(v.value==localStorage.FVPlayerHLSQuality){qswitch=localStorage.FVPlayerHLSQuality;return false}})}else if(flowplayer.conf.hd_streaming&&!flowplayer.support.fvmobile){jQuery(api.video.qualities).each(function(k,v){var height=parseInt(v.label);if(height>0&&qswitch==-1&&height>=720&&height<=720){qswitch=v.value}})}qswitch=parseInt(qswitch);if(qswitch>-1){root.one("progress",function(){setTimeout(function(){api.quality(qswitch)})})}quality_sort()}}else if(api.video.sources_fvqs&&api.video.sources_fvqs.length>0&&api.video.src.match(/vimeo.*?\.mp4/)){setTimeout(quality_sort,0)}root.find("a[data-quality]").removeClass("is-current")});if(search.match(/dash_debug/)||search.match(/hls_debug/))var debug_log=jQuery('<div class="fv-debug" style="background: gray; color: white; top: 10%; position: absolute; z-index: 1000">').appendTo(root.find(".fp-player"));api.bind("ready progress",quality_process);api.bind("quality",function(){setTimeout(quality_process,0)});function quality_process(){if(api.engine.engineName=="dash"){var stream_info=bitrates[api.engine.dash.getQualityFor("video")];if(stream_info.qualityIndex!=last_quality){last_quality=stream_info.qualityIndex;quality_label(stream_info.qualityIndex,bitrates)}if(search.match(/dash_debug/))quality_debug(stream_info.width,stream_info.height,stream_info.bitrate)}else if(api.engine.engineName=="hlsjs-lite"){if(hlsjs.currentLevel!=last_quality){last_quality=hlsjs.currentLevel;quality_label(hlsjs.currentLevel,hlsjs.levels)}if(search.match(/hls_debug/)){var level=hlsjs.levels[hlsjs.currentLevel];if(level){quality_debug(level.width,level.height,level.bitrate)}}}}function quality_label(index,qualities){if(!qualities[index])return;var height=qualities[index].height,hd_limit=541,lowest=1e5;jQuery(qualities).each(function(k,v){if(v.height>=720&&v.height<1400)hd_limit=720;if(v.height<lowest)lowest=v.height;if(localStorage.FVPlayerHLSQuality==v.height){root.find("a[data-quality]").removeClass("fp-selected fp-color");root.find("a[data-quality="+k+"]").addClass("fp-selected fp-color")}});root.find("a[data-quality]").removeClass("is-current");root.find("a[data-quality="+index+"]").addClass("is-current");var label="SD";if(height>=360&&lowest<height)label="SD";if(height>=hd_limit)label="HD";if(height>=1400)label="4K";root.find(".fp-qsel").html(label)}function quality_debug(w,h,br){debug_log.html("Using "+w+"x"+h+" at "+Math.round(br/1024)+" kbps")}function quality_sort(){var menu=root.find(".fp-qsel-menu");menu.children().each(function(i,a){menu.prepend(a)});menu.children().each(function(i,a){if(/^NaNp/.test(jQuery(a).html())){var bitrate=jQuery(a).html().match(/\((.*?)\)/);if(bitrate&&typeof bitrate[1]!=="undefined"){jQuery(a).html(bitrate[1])}}else{jQuery(a).html(jQuery(a).html().replace(/\(.*?\)/,""))}});menu.prepend(menu.find("a[data-quality=-1]"));menu.prepend(menu.find("strong"))}});flowplayer(function(api,root){root=jQuery(root);var player_id=root.attr("id"),ad=false;if(root.data("end_popup_preview")){jQuery(document).ready(function(){api.trigger("finish",[api])})}function ad_height_check(){var count=0;var ad_height_check=setInterval(function(){var height=ad&&ad.find(".adsbygoogle").height();count++;if(count>20*10||height>0)clearInterval(ad_height_check);if(height>root.height()){ad.addClass("tall-ad")}},50)}function show_ad(){var ad_data=root.attr("data-ad");if(typeof ad_data!="undefined"&&ad_data.length){try{ad_data=JSON.parse(ad_data)}catch(e){return false}if(!ad&&!root.hasClass("is-cva")&&root.width()>=parseInt(ad_data.width)){var html=ad_data.html;html=html.replace("%random%",Math.random());ad=jQuery('<div id="'+player_id+'_ad" class="wpfp_custom_ad">'+html+"</div>");root.find(".fp-player").append(ad);ad_height_check();setTimeout(function(){if(root.find(".wpfp_custom_ad video").length){api.pause()}},500)}}}function show_popup(event){var popup_data=root.attr("data-popup");if(typeof popup_data!="undefined"&&popup_data.length){try{popup_data=JSON.parse(popup_data)}catch(e){return false}if(event=="finish"||popup_data.pause||popup_data.html.match(/fv-player-ppv-purchase-btn-wrapper/)){root.addClass("is-popup-showing");root.find(".fp-player").append('<div id="'+player_id+'_custom_popup" class="wpfp_custom_popup">'+popup_data.html+"</div>")}}}api.bind("ready",function(e,api){if(ad.length==1){ad.remove();ad=false}if(!root.data("ad_show_after")){show_ad()}}).bind("progress",function(e,api,current){if(current>root.data("ad_show_after")){show_ad()}}).bind("finish",function(e,api){if(typeof api.video.index=="undefined"||api.video.index+1==api.conf.playlist.length){show_popup(e.type)}}).bind("pause",function(e,api){show_popup(e.type)}).bind("resume unload seek",function(e,api){if(root.hasClass("is-popup-showing")){root.find(".wpfp_custom_popup").remove();root.removeClass("is-popup-showing")}})});jQuery(document).on("click",".fv_fp_close",function(){var ad=jQuery(this).parents(".wpfp_custom_ad_content"),video=ad.find("video");ad.fadeOut();if(video.length)video[0].pause();return false});jQuery(document).on("focus",".fv_player_popup input[type=text], .fv_player_popup input[type=email], .fv_player_popup textarea",function(){var api=jQuery(this).parents(".flowplayer").data("flowplayer");if(api)api.disable(true)});jQuery(document).on("blur",".fv_player_popup input[type=text], .fv_player_popup input[type=email], .fv_player_popup textarea",function(){var api=jQuery(this).parents(".flowplayer").data("flowplayer");if(api)api.disable(false)});flowplayer(function(api,root){api.on("ready",function(e,api,video){api.one("progress",function(){jQuery(root).find(".fp-airplay").toggle(api.engine.engineName=="html5")})})});flowplayer(function(api,root){var root=jQuery(root),bean=flowplayer.bean,time=0,last=0,timer,event_name;if(typeof ga=="undefined"&&api.conf.fvanalytics&&typeof _gat=="undefined"&&typeof gtag=="undefined"){if(is_ga_4(api)){jQuery.getScript({url:"https://www.googletagmanager.com/gtag/js?id="+api.conf.fvanalytics,cache:true},function(){window.dataLayer=window.dataLayer||[];window.gtag=function(){window.dataLayer.push(arguments)};window.gtag("js",new Date);window.gtag("config",api.conf.fvanalytics)})}else{jQuery.getScript({url:"https://www.google-analytics.com/analytics.js",cache:true},function(){ga("create",api.conf.fvanalytics,"auto")})}}if(!window._paq&&api.conf.matomo_domain&&api.conf.matomo_site_id){var u="//"+api.conf.matomo_domain+"/";var _paq=window._paq=window._paq||[];_paq.push(["setTrackerUrl",u+"matomo.php"]);_paq.push(["setSiteId",api.conf.matomo_site_id]);var d=document,g=d.createElement("script"),s=d.getElementsByTagName("script")[0];g.type="text/javascript";g.async=true;g.src=u+"matomo.js";s.parentNode.insertBefore(g,s)}api.bind("progress",function(e,api,current){fv_track(e,api,current)}).bind("finish ready ",function(e,api){for(var j in fv_ga_events){if(!fv_ga_events.hasOwnProperty(j))continue;root.removeData("fv_track_"+fv_ga_events[j])}}).bind("error",function(e,api,error){setTimeout(function(){if(!api.error)return;var video=typeof api.video!="undefined"&&typeof api.video.src!="undefined"?api.video:false;if(!video&&typeof api.conf.clip!="undefined"&&typeof api.conf.clip.sources!="undefined"&&typeof api.conf.clip.sources[0]!="undefined"&&typeof api.conf.clip.sources[0].src!="undefined")video=api.conf.clip.sources[0];var name=fv_player_track_name(root,video);if(name&&!name.match(/\/\/vimeo.com\/\d/)){if(is_ga_4(api)){}else{fv_player_track(api,false,"Video "+(root.hasClass("is-cva")?"Ad ":"")+"error",error.message,name)}}},100)});api.bind("load unload",fv_track_seconds_played).bind("progress",function(e,api){if(!api.seeking){time+=last?+new Date-last:0;last=+new Date}if(!timer){timer=setTimeout(function(){timer=null;if(!is_ga_4(api)){fv_player_track(api,false,"Flowplayer heartbeat",api.engine.engineName+"/"+api.video.type,"Heartbeat",0)}},10*60*1e3)}}).bind("pause",function(){last=0});api.bind("shutdown",function(){bean.off(window,"unload",fv_track_seconds_played)});bean.on(window,"unload",fv_track_seconds_played);var fv_ga_events=is_ga_4(api)?["Play","25 Percent Played","50 Percent Played","75 Percent Played","100 Percent Played"]:["start","first quartile","second quartile","third quartile","complete"];function fv_track_seconds_played(e,api_not_needed,video){video=video||api.video;if(e.type==="load"){event_name=fv_player_track_name(root,video)}if(time){fv_player_track(api,false,"Video / Seconds played",api.engine.engineName+"/"+api.video.type,event_name,Math.round(time/1e3));time=0;if(timer){clearTimeout(timer);timer=null}}}function fv_track(e,api,data){var video=api.video,dur=video.duration,i=0;var name=fv_player_track_name(root,video);if(dur){if(data>19*dur/20)i=4;else if(data>3*dur/4)i=3;else if(data>dur/2)i=2;else if(data>dur/4)i=1}if(api.live)i=0;if(root.data("fv_track_"+fv_ga_events[i]))return;for(var j in fv_ga_events){if(!fv_ga_events.hasOwnProperty(j))continue;if(j==i)break;if(!root.data("fv_track_"+fv_ga_events[j]))return}root.trigger("fv_track_"+fv_ga_events[i].replace(/ /,"_"),[api,name]);root.data("fv_track_"+fv_ga_events[i],true);fv_player_track(api,false,"Video "+(root.hasClass("is-cva")?"Ad ":"")+fv_ga_events[i],api.engine.engineName+"/"+video.type,name)}api.get_time_played=function(){return time/1e3}});function is_ga_4(api){if(typeof api.conf.fvanalytics!="undefined"&&api.conf.fvanalytics&&api.conf.fvanalytics.startsWith("G-"))return true;return false}function fv_player_track(api,ga_id,event,engineType,name,value){if(!ga_id)ga_id=flowplayer.conf.fvanalytics;if(typeof engineType=="undefined")engineType="Unknown engine";if(/fv_player_track_debug/.test(window.location.href))console.log("FV Player Track: "+event+" - "+engineType+" '"+name+"'",value);if(typeof gtag!="undefined"){if(is_ga_4(api)){gtag("event",event,{video_current_time:api.video.time,video_provider:engineType,video_duration:api.video.duration,value:value?value:1})}else{gtag("event",event,{event_category:engineType,event_label:name,value:value?value:1})}}else if(ga_id&&typeof ga!="undefined"){ga("create",ga_id,"auto",name,{allowLinker:true});ga("require","linker");if(value){ga("send","event",event,engineType,name,value)}else{ga("send","event",event,engineType,name)}}else if(ga_id&&typeof _gat!="undefined"){var tracker=_gat._getTracker(ga_id);if(typeof tracker._setAllowLinker=="undefined"){return}tracker._setAllowLinker(true);if(value){tracker._trackEvent(event,engineType,name,value)}else{tracker._trackEvent(event,engineType,name)}}if(flowplayer.conf.matomo_domain&&flowplayer.conf.matomo_site_id&&typeof _paq!="undefined"){if(value){_paq.push(["trackEvent",event,engineType,name,value])}else{_paq.push(["trackEvent",event,engineType,name])}}}function fv_player_track_name(root,video){var name=root.attr("title");if(!name&&typeof video.fv_title!="undefined")name=video.fv_title;if(!name&&typeof video.title!="undefined")name=video.title;if(!name&&typeof video.src!="undefined"){name=video.src.split("/").slice(-1)[0].replace(/\.(\w{3,4})(\?.*)?$/i,"");if(video.type.match(/mpegurl/))name=video.src.split("/").slice(-2)[0].replace(/\.(\w{3,4})(\?.*)?$/i,"")+"/"+name}return name}flowplayer(function(api,root){root=jQuery(root);var player=root.find(".fp-player"),had_no_volume=root.hasClass("no-volume"),had_fp_mute=root.hasClass("fp-mute"),had_fp_full=root.hasClass("fp-full"),buttons_count=0;function check_size(){var width=player.width()||root.width(),video_index=api.video.index?api.video.index:0;if(width>900){jQuery(".fp-subtitle",root).addClass("is-wide")}else{jQuery(".fp-subtitle",root).removeClass("is-wide")}root.toggleClass("is-tiny",width<400);root.toggleClass("is-small",width<600&&width>=400);var too_narrow=width<480+buttons_count*35;if(typeof api.fv_timeline_chapters_data!="undefined"&&typeof api.fv_timeline_chapters_data[video_index]!="undefined"){too_narrow=true}if(!had_fp_full){root.toggleClass("fp-full",root.hasClass("has-abloop")||too_narrow)}var size="";if(width<400)size="is-tiny";else if(width<600&&width>=400)size="is-small";root.trigger("fv-player-size",[size]);var el=player;if(root.parent().hasClass("fp-playlist-vertical-wrapper")||root.parent().hasClass("fp-playlist-text-wrapper"))el=root.parent();if(el.width()<=560){el.addClass("is-fv-narrow")}else{el.removeClass("is-fv-narrow")}if(width<=320){root.addClass("no-volume fp-mute")}else{if(!had_no_volume)root.removeClass("no-volume");if(!had_fp_mute)root.removeClass("fp-mute")}}check_size();jQuery(window).on("resize",check_size);api.on("ready fullscreen fullscreen-exit sticky sticky-exit",function(e){setTimeout(function(){buttons_count=root.find(".fp-controls > strong:visible").length+root.find(".fp-controls > .fp-icon:visible").length;check_size()},0)});api.on("unload pause finish error",function(){if(typeof checker!=="undefined")clearInterval(checker)})});jQuery(window).on("resize tabsactivate",function(){jQuery(".fp-playlist-external").each(function(){var playlist=jQuery(this);if(playlist.parent().width()>=900)playlist.addClass("is-wide");else playlist.removeClass("is-wide")})}).trigger("resize");flowplayer(function(api,root){api.bind("ready",function(){if(/Chrome/.test(navigator.userAgent)&&parseFloat(/Chrome\/(\d\d)/.exec(navigator.userAgent)[1],10)>54){if(api.video.subtitles){jQuery(root).addClass("chrome55fix-subtitles")}else{jQuery(root).addClass("chrome55fix")}}});root=jQuery(root);var image_src=root.css("background-image");if(image_src){image_src=image_src.replace(/url\((['"])?(.*?)\1\)/gi,"$2").split(",");if(!image_src||!image_src[0].match(/^(https?:)?\/\//))return;var image=new Image;image.src=image_src[0];var image_ratio=image.height/image.width;var player_ratio=root.height()/root.width();var ratio_diff=Math.abs(player_ratio-image_ratio);if(ratio_diff<.05){root.css("background-size","cover")}}});(function($){$(window).on("resize",function(){var iframe=$("iframe[id][src][height][width]");iframe.each(function(){if($(this).attr("id").match(/(fv_vimeo_)|(fv_ytplayer_)/)&&$(this).width()<=$(this).attr("width"))$(this).height($(this).width()*$(this).attr("height")/$(this).attr("width"))});var wistia=jQuery(".wistia_embed");wistia.each(function(){$(this).height($(this).width()*$(this).data("ratio"))})}).trigger("resize")})(jQuery);jQuery(document).on("tabsactivate",".fv_flowplayer_tabs_content",function(event,ui){var oldPlayer=jQuery(".flowplayer.is-playing").data("flowplayer");if(typeof oldPlayer!="undefined"){oldPlayer.pause()}var objPlayer=jQuery(".flowplayer",ui.newPanel);var api=objPlayer.data("flowplayer");api.load()});flowplayer(function(api,root){root=jQuery(root);var bean=flowplayer.bean;if(root.hasClass("is-audio")){bean.off(root[0],"mouseenter");bean.off(root[0],"mouseleave");root.removeClass("is-mouseout");root.addClass("fixed-controls").addClass("is-mouseover");api.on("error",function(e,api,error){jQuery(".fp-message",root).html(jQuery(".fp-message",root).html().replace(/video/,"audio"))});root.on("click",function(e){if(!api.ready){e.preventDefault();e.stopPropagation();api.load()}})}});flowplayer(function(api,root){if(!api.conf.fv_chromecast)return;if(!window["__onGCastApiAvailable"]){jQuery.getScript({url:"https://www.gstatic.com/cv/js/sender/v1/cast_sender.js",cache:true});window["__onGCastApiAvailable"]=function(loaded){if(!loaded)return;initialize()}}var conf=api.conf.chromecast||{},session,timer,trigger,bean=flowplayer.bean,common=flowplayer.common,waiting_for_seek=false;function initialize(){var applicationId,sessionRequest,apiConfig;applicationId=conf.applicationId||chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID;sessionRequest=new chrome.cast.SessionRequest(applicationId);apiConfig=new chrome.cast.ApiConfig(sessionRequest,sessionListener,receiverListener);chrome.cast.initialize(apiConfig,onInitSuccess,onError)}function sessionListener(){}function receiverListener(ev){console.log("FV Player: Chromecast listener",ev);if(ev!==chrome.cast.ReceiverAvailability.AVAILABLE)return;flowplayer.conf.chromecast_available=true}function onInitSuccess(){}function onError(){console.log("chromecast onError")}function createUIElements(){var btnContainer=common.find(".fp-header",root)[0];if(!btnContainer)return;common.find(".fp-chromecast",btnContainer).forEach(common.removeNode);common.find(".fp-chromecast-engine",root).forEach(common.removeNode);trigger=common.createElement("a",{class:"fp-chromecast fp-icon",title:"Play on Cast device"});btnContainer.appendChild(trigger);var chromeCastEngine=common.createElement("div",{class:"fp-chromecast-engine"}),chromeCastStatus=common.createElement("p",{class:"fp-chromecast-engine-status"}),chromeCastIcon=common.createElement("p",{class:"fp-chromecast-engine-icon"});chromeCastEngine.appendChild(chromeCastIcon);chromeCastEngine.appendChild(chromeCastStatus);var engine=common.find(".fp-engine",root)[0];if(!engine)common.prepend(common.find(".fp-player",root)[0]||root,chromeCastEngine);else engine.parentNode.insertBefore(chromeCastEngine,engine)}function destroy(){clearInterval(timer);timer=null;api.release();common.toggleClass(root,"is-chromecast",false);common.toggleClass(trigger,"fp-active",false)}function get_media(){var media=false;var sources=api.video.sources_fvqs||api.video.sources;for(var i in sources){var type=sources[i].type;if(type=="video/mp4"||type=="video/fv-mp4"||type=="application/dash+xml"){media=sources[i];break}}if(!media){for(var i in sources){if(sources[i].type=="application/x-mpegurl"){media=sources[i];break}}}if(api.video.fvhkey&&!api.conf.hls_cast)return false;if(media){var top_quality=false,mp4_qualities=["fullhd","hd","md","sd"];for(var quality in mp4_qualities){var re=new RegExp("-"+mp4_qualities[quality]);for(var i in api.video.sources_fvqs){var source=api.video.sources_fvqs[i];if(source.src.match(re)&&source.type=="video/mp4"){top_quality=source;break}}if(top_quality){media=top_quality;break}}}return media}function load_media(){var media=get_media();if(!media){return false}var cast_subtitles=[];if(api.video.subtitles){api.video.subtitles.forEach(function(v,k){if(v.src.match(/\.srt/)){console.log("FV Player: Chromecast doesn't support SRT subtitles")}var subtitles=new chrome.cast.media.Track(k,chrome.cast.media.TrackType.TEXT);subtitles.trackContentId=v.src;subtitles.trackContentType="text/vtt";subtitles.subtype=chrome.cast.media.TextTrackType.SUBTITLES;subtitles.name=v.label;subtitles.language=v.srclang+"-"+k,subtitles.customData=null;cast_subtitles.push(subtitles)})}var mediaInfo=new chrome.cast.media.MediaInfo(media.src,media.type);mediaInfo.tracks=cast_subtitles;var request=new chrome.cast.media.LoadRequest(mediaInfo);if(!api.live){request.currentTime=api.video.time}clearInterval(timer);timer=false;session.loadMedia(request,onMediaDiscovered,function onMediaError(e){console.log("onMediaError",e)})}function onMediaDiscovered(chromecast){switch_tracks(chromecast);chromecast.addUpdateListener(function(alive){if(!session)return;timer=timer||setInterval(function(){api.trigger("progress",[api,chromecast.getEstimatedTime()]);chromecast.activeTrackIds.forEach(function(track_id){jQuery.each(chromecast.media.tracks,function(k,v){if(v.trackId==track_id&&v.type=="AUDIO"){var found=hilight_audio_track("data-audio",v.language);if(!found){hilight_audio_track("data-lang",v.language)}return false}})})},500);if(alive){common.toggleClass(root,"is-chromecast",true);common.toggleClass(trigger,"fp-active",true);api.hijack({pause:function(){console.log("hijacked pause!");chromecast.pause()},resume:function(){if(api.finished){clearInterval(timer);timer=null;api.release();load_media();return}chromecast.play()},seek:function(time){var req=new chrome.cast.media.SeekRequest;req.currentTime=time;chromecast.seek(req)}})}var playerState=chromecast.playerState;if(api.paused&&playerState===chrome.cast.media.PlayerState.PLAYING)api.trigger("resume",[api]);if(api.playing&&playerState===chrome.cast.media.PlayerState.PAUSED)api.trigger("pause",[api]);if(api.seeking&&playerState===chrome.cast.media.PlayerState.BUFFERING){waiting_for_seek=true}if(api.seeking&&playerState===chrome.cast.media.PlayerState.PLAYING&&waiting_for_seek){waiting_for_seek=false;api.trigger("seek",[api])}if(playerState==chrome.cast.media.PlayerState.IDLE&&chromecast.idleReason==chrome.cast.media.IdleReason.FINISHED){api.trigger("finish",[api])}common.toggleClass(root,"is-loading",playerState===chrome.cast.media.PlayerState.BUFFERING)})}api.bind("ready",function(e,api,video){if(session){if(get_media()){api.one("progress",function(e,api){api.release();api.pause();api.mute(false,true);load_media()});api.mute(true,true)}else{session.stop();session=null;destroy();jQuery(trigger).hide()}return}if(!flowplayer.conf.chromecast_available)return;if(get_media()){createUIElements();jQuery(trigger).show()}else{FV_Flowplayer_Pro.log("FV Player: Can't find media source suitable for Chromecast!");jQuery(trigger).hide()}});bean.on(root,"click",".fp-chromecast",function(ev){ev.preventDefault();if(session){api.trigger("pause",[api]);if(session.media[0].media){var seek=session.media[0].getEstimatedTime();setTimeout(function(){api.seek(seek)},0)}session.stop();session=null;destroy();return}if(api.playing)api.pause();chrome.cast.requestSession(function(s){jQuery(root).addClass("is-loading");session=s;var receiverName=session.receiver.friendlyName;common.html(common.find(".fp-chromecast-engine-status",root)[0],"Playing on device "+receiverName);load_media()},function(err){console.error("requestSession error",err)})});bean.on(root,"click",".fv-fp-hls-menu [data-audio], .fp-subtitle-menu [data-subtitle-index]",function(){if(session&&session.media[0].media){switch_tracks(session.media[0]);return false}});jQuery(window).on("unload",function(){if(session){session.stop()}});function hilight_audio_track(attr,chromecast_language){var audio_tracks_menu=jQuery(root).find(".fv-fp-hls-menu a"),found=false;audio_tracks_menu.each(function(k,el){if(jQuery(el).attr(attr)===chromecast_language){jQuery(el).addClass("fp-selected");found=true}else{jQuery(el).removeClass("fp-selected")}});return found}function switch_tracks(chromecast){console.log(chromecast.media.tracks);var audio=jQuery(root).find(".fv-fp-hls-menu [data-audio].fp-selected").data("audio"),audio_lang=jQuery(root).find(".fv-fp-hls-menu [data-audio].fp-selected").data("lang"),subtitle_index=jQuery(root).find(".fp-subtitle-menu [data-subtitle-index].fp-selected").data("subtitle-index"),subtitles=subtitle_index>-1?api.video.subtitles[subtitle_index].srclang:false;var audio_found=false,subtitles_found=false,tracks_selected=[];jQuery.each(chromecast.media.tracks,function(k,v){if(v.language==audio&&v.type=="AUDIO"){audio_found=v}if(v.language==subtitles+"-"+subtitle_index&&v.type=="TEXT"){subtitles_found=v}});if(!audio_found){jQuery.each(chromecast.media.tracks,function(k,v){if(v.language==audio_lang&&v.type=="AUDIO"){audio_found=v;return false}})}var debug_log="";if(audio_found){tracks_selected.push(audio_found.trackId);debug_log+=audio_found.language+" audio"}if(subtitles_found){tracks_selected.push(subtitles_found.trackId);if(debug_log)debug_log+=" ";debug_log+=subtitles_found.language+" subtitles"}if(tracks_selected){var request=new chrome.cast.media.EditTracksInfoRequest(tracks_selected);chromecast.editTracksInfo(request,function(){console.log("FV Player: Chromecast "+debug_log+" loaded")},function(){console.log("FV Player: Chromecast "+debug_log+" failed")})}}});jQuery(document).on("mfpClose",function(){if(typeof jQuery(".flowplayer").data("flowplayer")!="undefined")jQuery(".flowplayer").data("flowplayer").unload()});jQuery(document).on("click",".vc_tta-tab a",function(){var api=jQuery(".flowplayer.is-playing").data("flowplayer");if(api)api.pause()});flowplayer(function(api,root){root=jQuery(root);api.bind("ready",function(){setTimeout(function(){var video=jQuery("video",root);if(video.length>0){video.prop("autoplay",false)}},100);root.find("video.fp-engine").addClass("intrinsic-ignore")})});jQuery(".flowplayer").on("ready",function(e,api){if(/BB10/.test(navigator.userAgent)){api.fullscreen()}});var fv_flowplayer_safety_resize_arr=Array();function fv_flowplayer_safety_resize(){var fv_flowplayer_safety_resize_init=false;jQuery(".flowplayer").each(function(){if(!jQuery(this).is(":visible")||jQuery(this).hasClass("lightboxed")||jQuery(this).hasClass("lightbox-starter")||jQuery(this).hasClass("is-audio"))return;if(jQuery(this).width()<30||jQuery(this).height()<20){fv_flowplayer_safety_resize_init=true;var el=jQuery(this);while(jQuery(el).width()<30||jQuery(el).width()==jQuery(this).width()){if(jQuery(el).parent().length==0)break;el=jQuery(el).parent()}jQuery(this).width(jQuery(el).width());jQuery(this).height(parseInt(jQuery(this).width()*jQuery(this).attr("data-ratio")));fv_flowplayer_safety_resize_arr[jQuery(this).attr("id")]=el}});if(fv_flowplayer_safety_resize_init){jQuery(window).resize(function(){jQuery(".flowplayer").each(function(){if(jQuery(this).hasClass("lightboxed")||jQuery(this).hasClass("lightbox-starter"))return;if(fv_flowplayer_safety_resize_arr[jQuery(this).attr("id")]){jQuery(this).width(fv_flowplayer_safety_resize_arr[jQuery(this).attr("id")].width());jQuery(this).height(parseInt(jQuery(this).width()*jQuery(this).attr("data-ratio")))}})})}}if(typeof flowplayer.conf.safety_resize!="undefined"&&flowplayer.conf.safety_resize){jQuery(document).ready(function(){setTimeout(function(){fv_flowplayer_safety_resize()},10)})}var isIE11=!!navigator.userAgent.match(/Trident.*rv[ :]*11\./);if(isIE11){jQuery(document).ready(function(){jQuery(".fp-waiting").hide()});flowplayer(function(api,root){api.bind("load",function(e){jQuery(e.currentTarget).find(".fp-waiting").show()}).bind("beforeseek",function(e){jQuery(e.currentTarget).find(".fp-waiting").show()}).bind("progress",function(e){jQuery(e.currentTarget).find(".fp-waiting").hide()}).bind("seek",function(e){jQuery(e.currentTarget).find(".fp-waiting").hide()}).bind("fullscreen",function(e){jQuery("#wpadminbar").hide()}).bind("fullscreen-exit",function(e){jQuery("#wpadminbar").show()})})}if(flowplayer.support.browser&&flowplayer.support.browser.msie&&parseInt(flowplayer.support.browser.version,10)<9){jQuery(".flowplayer").each(function(){jQuery(this).css("width",jQuery(this).css("max-width"));jQuery(this).css("height",jQuery(this).css("max-height"))})}if(location.href.match(/elementor-preview=/)){console.log("FV Player: Elementor editor is active");setInterval(fv_player_load,1e3)}else if(location.href.match(/brizy-edit-iframe/)){console.log("FV Player: Brizy editor is active");setInterval(fv_player_load,1e3)}if(window.DELEGATE_NAMES){flowplayer(function(api,root){fv_player_notice(root,fv_flowplayer_translations.chrome_extension_disable_html5_autoplay)})}flowplayer(function(api,root){flowplayer.bean.off(root,"contextmenu")});if(location.href.match(/elementor-preview=/)){console.log("FV Player: Elementor editor is active");setInterval(fv_player_load,1e3)}flowplayer(function(player,root){root=jQuery(root);if(typeof root.data("fv-embed")=="undefined"||!root.data("fv-embed")||root.data("fv-embed")=="false")return;player.embedCode=function(){var video=player.video;var width=root.width();var height=root.height();height+=2;if(root.hasClass("has-chapters")||root.hasClass("has-transcript")){height+=300}if(jQuery(".fp-playlist-external[rel="+root.attr("id")+"]").length>0){height+=150+20}var link=root.data("fv-embed")+"#"+fv_player_get_video_link_hash(player);return'<iframe src="'+link+'" allowfullscreen width="'+width+'" height="'+height+'" frameborder="0" style="max-width:100%"></iframe>'}});jQuery(document).on("click",".flowplayer .embed-code-toggle",function(){var button=jQuery(this);var player=button.parents(".flowplayer");var api=player.data("flowplayer");if(typeof api.embedCode=="function"){player.find(".embed-code textarea").val(api.embedCode())}fv_player_clipboard(player.find(".embed-code textarea").val(),function(){fv_player_notice(player,fv_flowplayer_translations.embed_copied,2e3)},function(){button.parents(".fvp-share-bar").find(".embed-code").toggle();button.parents(".fvp-share-bar").toggleClass("visible")});return false});flowplayer(function(player,root){if(jQuery(root).data("fullscreen")==false){return}player.one("ready",function(e,api,video){if(jQuery(root).find(".fp-fullscreen").length==0){jQuery(root).find(".fp-header").append('<a class="fp-fullscreen fp-icon"></a>')}});var FS_ENTER="fullscreen",FS_EXIT="fullscreen-exit",FS_SUPPORT=flowplayer.support.fullscreen,win=window,scrollX,scrollY,bean=flowplayer.bean;player.fullscreen=function(flag){if(player.disabled)return;var video=common.find("video.fp-engine",root)[0];if(flowplayer.conf.native_fullscreen&&video&&flowplayer.support.iOS){player.trigger(FS_ENTER,[player]);bean.on(document,"webkitfullscreenchange.nativefullscreen",function(){if(document.webkitFullscreenElement!==video)return;bean.off(document,".nativefullscreen");bean.on(document,"webkitfullscreenchange.nativefullscreen",function(){if(document.webkitFullscreenElement)return;bean.off(document,".nativefullscreen");player.trigger(FS_EXIT,[player])})});video.webkitEnterFullScreen();bean.one(video,"webkitendfullscreen",function(){bean.off(document,"fullscreenchange.nativefullscreen");player.trigger(FS_EXIT,[player]);common.prop(video,"controls",true);common.prop(video,"controls",false)});return}var wrapper=jQuery(root).find(".fp-player")[0];if(flag===undefined)flag=!player.isFullscreen;if(flag){scrollY=win.scrollY;scrollX=win.scrollX}if(FS_SUPPORT){if(flag){["requestFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen"].forEach(function(fName){if(typeof wrapper[fName]==="function"){wrapper[fName]({navigationUI:"hide"});if(fName==="webkitRequestFullScreen"&&!document.webkitFullscreenElement){wrapper[fName]()}}})}else{["exitFullscreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen"].forEach(function(fName){if(typeof document[fName]==="function"){document[fName]()}})}}else{player.trigger(flag?FS_ENTER:FS_EXIT,[player])}return player};var lastClick,common=flowplayer.common;player.on("mousedown.fs",function(){if(+new Date-lastClick<150&&player.ready)player.fullscreen();lastClick=+new Date});player.on(FS_ENTER,function(){common.addClass(root,"is-fullscreen");common.toggleClass(root,"fp-minimal-fullscreen",common.hasClass(root,"fp-minimal"));common.removeClass(root,"fp-minimal");if(!FS_SUPPORT)common.css(root,"position","fixed");player.isFullscreen=true}).on(FS_EXIT,function(){var oldOpacity;common.toggleClass(root,"fp-minimal",common.hasClass(root,"fp-minimal-fullscreen"));common.removeClass(root,"fp-minimal-fullscreen");if(!FS_SUPPORT&&player.engine==="html5"){oldOpacity=root.css("opacity")||"";common.css(root,"opacity",0)}if(!FS_SUPPORT)common.css(root,"position","");common.removeClass(root,"is-fullscreen");if(!FS_SUPPORT&&player.engine==="html5")setTimeout(function(){root.css("opacity",oldOpacity)});player.isFullscreen=false;if(player.engine.engineName!="fvyoutube"){win.scrollTo(scrollX,scrollY)}}).on("unload",function(){if(player.isFullscreen)player.fullscreen()});player.on("shutdown",function(){FULL_PLAYER=null;common.removeNode(wrapper)})});flowplayer(function(api,root){root=jQuery(root);if(flowplayer.conf.wpadmin||jQuery(root).hasClass("is-audio"))return;var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]"),playlist_with_fullscreen=playlist.hasClass("fp-playlist-season")||playlist.hasClass("fp-playlist-polaroid");fsforce=root.data("fsforce")==true;if(root.data("fullscreen")==false){return}if(flowplayer.conf.mobile_force_fullscreen&&flowplayer.support.fvmobile||!flowplayer.support.fullscreen&&fsforce||playlist_with_fullscreen){if(!flowplayer.support.fullscreen){api.bind("ready",function(){if(api.video.vr)return;api.fullscreen(true)})}root.on("click",function(){if(!api.ready||api.paused)api.fullscreen(true)});jQuery("[rel="+root.attr("id")+"] a").on("click",function(e){if(!api.isFullscreen){api.fullscreen();api.resume()}});api.on("resume",function(){if(api.video.vr)return;if(!api.isFullscreen)api.fullscreen()});api.on("finish",function(){if(api.conf.playlist.length==0||api.conf.playlist.length-1==api.video.index)api.fullscreen(false)}).on("fullscreen",function(a,api){root.addClass("forced-fullscreen")}).on("fullscreen-exit",function(a,api){api.pause();root.removeClass("forced-fullscreen")})}else if(fsforce){var position,unload=root.find(".fp-unload"),is_closing=false;api.isFakeFullscreen=false;unload.show();root.on("click",function(e){if(!api.ready&&e.target!=unload[0])api.fakeFullscreen(true)});unload.on("click",function(e){if(api.ready){api.fullscreen(false)}else if(api.loading){is_closing=true;api.one("resume",function(e){is_closing=false;api.pause()})}api.fakeFullscreen(false);return false});jQuery("[rel="+root.attr("id")+"] a").on("click",function(e){if(!api.isFakeFullscreen){api.fakeFullscreen();api.resume()}});api.on("resume",function(){if(!is_closing&&!api.isFakeFullscreen)api.fakeFullscreen()}).on("finish",function(){if(api.conf.playlist.length==0||api.conf.playlist.length-1==api.video.index)api.fakeFullscreen(false)}).on("fullscreen",function(a,api){root.removeClass("fake-fullscreen")}).on("fullscreen-exit",function(a,api){if(api.isFakeFullscreen)api.fakeFullscreen(true,true)}).on("unload",function(a,api){});api.fakeFullscreen=function(flag,force){if(!force&&(api.isFakeFullscreen==flag||api.disabled))return;if(position===undefined)position=root.css("position");if(flag===undefined)flag=!api.isFakeFullscreen;api.isFakeFullscreen=flag;api.trigger(flag?"fakefullscreen":"fakefullscreen-exit",[api]);root.toggleClass("is-fullscreen fake-fullscreen forced-fullscreen",flag);if(flag){root.css("position","fixed")}else{root.css("position",position)}}}if(flowplayer.support.android&&flowplayer.conf.mobile_landscape_fullscreen&&window.screen&&window.screen.orientation){api.on("fullscreen",function(a,api){if(typeof api.video.width!="undefined"&&typeof api.video.height!="undefined"&&(api.video.width!=0&&api.video.height!=0&&api.video.width<api.video.height)){screen.orientation.lock("portrait-primary")}else{screen.orientation.lock("landscape-primary")}})}});flowplayer(function(api,root){root=jQuery(root);var hlsjs,player,audioUXGroup,audioGroups,hls_audio_button,hls_audio_menu,mse=window.MediaSource||window.WebKitMediaSource;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls});api.bind("ready",function(e,api){removeAudioMenu();if(hlsjs&&api.video.type=="application/x-mpegurl"){parseAudioTracksHlsJs(hlsjs);createAudioMenu()}});api.one("progress",function(){if(api.engine.engineName=="html5"&&api.video.type=="application/x-mpegurl"){parseAudioTracksSafari();createAudioMenu()}});function getVideoTagAudioTracks(){var video=root.find("video");if(video.length&&video[0].audioTracks){return video[0].audioTracks}return[]}function hilightAudioTrack(audioTrack){if(!audioTrack.name)audioTrack.name=audioTrack.label;root.find(".fv-fp-hls-menu a").each(function(k,el){jQuery(el).toggleClass("fp-selected",jQuery(el).attr("data-audio")===audioTrack.name)})}function createAudioMenu(){if(!audioUXGroup||audioUXGroup.length<2){return}hls_audio_button=jQuery('<strong class="fv-fp-hls">AUD</strong>');hls_audio_menu=jQuery('<div class="fp-menu fv-fp-hls-menu"></div>').insertAfter(root.find(".fp-controls"));hls_audio_menu.append("<strong>Audio</strong>");audioUXGroup.forEach(function(audioTrack){hls_audio_menu.append('<a data-audio="'+audioTrack.name+'" data-lang="'+audioTrack.lang+'">'+audioTrack.name+"</a>")});hls_audio_button.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();if(hls_audio_menu.hasClass("fp-active")){api.hideMenu(hls_audio_menu[0])}else{root.click();api.showMenu(hls_audio_menu[0])}});jQuery("a",hls_audio_menu).on("click",function(e){var adata=e.target.getAttribute("data-audio");if(hlsjs){var gid=hlsjs.audioTracks[hlsjs.audioTrack].groupId;var atrack=hlsjs.audioTracks.filter(function(at){return at.groupId===gid&&(at.name===adata||at.lang===adata)})[0];hlsjs.audioTrack=atrack.id;hilightAudioTrack(atrack)}else{var tracks=getVideoTagAudioTracks();for(var i in tracks){if(!tracks.hasOwnProperty(i))continue;if(tracks[i].label==adata){tracks[i].enabled=true;hilightAudioTrack(tracks[i])}}}});if(hlsjs){hilightAudioTrack(hlsjs.audioTracks[hlsjs.audioTrack])}else{var tracks=getVideoTagAudioTracks();for(var i in tracks){if(!tracks.hasOwnProperty(i))continue;if(tracks[i].enabled){hilightAudioTrack(tracks[i])}}}}function removeAudioMenu(){jQuery(hls_audio_menu).remove();jQuery(hls_audio_button).remove()}function parseAudioTracksHlsJs(data){audioGroups=[];audioUXGroup=[];data.levels.forEach(function(level){var agroup=level.attrs.AUDIO;if(agroup&&audioGroups.indexOf(agroup)<0){audioGroups.push(agroup)}if(audioGroups.length){audioUXGroup=data.audioTracks.filter(function(audioTrack){return audioTrack.groupId===audioGroups[0]})}})}function parseAudioTracksSafari(){audioGroups=[];audioUXGroup=[];var tracks=getVideoTagAudioTracks();for(var i in tracks){if(!tracks.hasOwnProperty(i))continue;audioUXGroup.push({id:tracks[i].id,name:tracks[i].label})}}});flowplayer(function(api,root){var store_engine_pos=-1;var store_engine=false;api.on("error",function(e,api,err){if(err.code!=4||api.engine.engineName!="hlsjs")return;console.log("FV Player: HLSJS failed to play the video, switching to Flash HLS");api.error=api.loading=false;jQuery(root).removeClass("is-error");jQuery(flowplayer.engines).each(function(k,v){if(flowplayer.engines[k].engineName=="hlsjs"){store_engine_pos=k;store_engine=flowplayer.engines[k];delete flowplayer.engines[k]}});var index=typeof api.video.index!="undefined"?api.video.index:0;var video=index>0?api.conf.playlist[index].sources:api.conf.clip.sources;video.index=index;api.load({sources:video});api.bind("unload error",function(){flowplayer.engines[store_engine_pos]=store_engine})})});flowplayer(function(api,root){var initialDelay=30,continueDelay=10,useDelay=initialDelay,retryLabel=fv_flowplayer_translations.live_stream_retry,timer;api.clearLiveStreamCountdown=function(){if(timer){clearInterval(timer);api.error=api.loading=false;jQuery(root).removeClass("is-error");jQuery(root).find(".fp-message.fp-shown").remove();api.unload()}};api.conf.flashls={manifestloadmaxretry:2};api.on("ready",function(){useDelay=initialDelay;retryLabel=fv_flowplayer_translations.live_stream_retry}).on("progress",function(){useDelay=continueDelay;retryLabel=fv_flowplayer_translations.live_stream_continue;clearInterval(timer)});api.on("error",function(e,api,err){setTimeout(function(){if(!api.conf.clip.live&&!api.conf.live&&!(err.video&&err.video.src.match(/\/\/vimeo.com\/event\//)))return;var delay=useDelay;if(api.conf.clip.streaming_time){delay=api.conf.clip.streaming_time-Math.floor(Date.now()/1e3)}else if(api.conf.clip.live_starts_in){delay=api.conf.clip.live_starts_in}var startLabel=fv_flowplayer_translations.live_stream_starting.replace(/%d/,secondsToDhms(delay));retryLabel=retryLabel.replace(/%d/,secondsToDhms(delay));var message=api.conf.clip.live_starts_in?startLabel:retryLabel;clearInterval(timer);if(err.code===1||err.code===2||err.code===4){root.className+=" is-offline";if(flowplayer.support.flashVideo){api.one("flashdisabled",function(){root.querySelector(".fp-flash-disabled").style.display="none"})}var messageElement=root.querySelector(".fp-ui .fp-message");messageElement.innerHTML=message;var reload_delay=delay>300?300:delay;timer=setInterval(function(){reload_delay-=1;delay-=1;if(reload_delay>0&&messageElement){messageElement.querySelector("span").innerHTML=secondsToDhms(delay)}else{clearInterval(timer);if(!api.error){return}api.error=api.loading=false;messageElement=root.querySelector(".fp-ui .fp-message");if(messageElement){root.querySelector(".fp-ui").removeChild(messageElement)}root.className=root.className.replace(/\bis-(error|offline)\b/g,"");api.load()}},1e3)}},1)});function secondsToDhms(seconds){seconds=Number(seconds);var d=Math.floor(seconds/(3600*24));var h=Math.floor(seconds%(3600*24)/3600);var m=Math.floor(seconds%3600/60);var s=Math.floor(seconds%60);var t=fv_flowplayer_translations;var output=d>0?d==1?t.duration_1_day.replace(/%s/,d):t.duration_n_days.replace(/%s/,d):"";if(output&&h>0)output+=", ";output+=h>0?h==1?t.duration_1_hour.replace(/%s/,h):t.duration_n_hours.replace(/%s/,h):"";if(output&&m>0)output+=", ";output+=m>0?m==1?t.duration_1_minute.replace(/%s/,m):t.duration_n_minutes.replace(/%s/,m):"";if(output&&s>0)output+=t.and;output+=s>0?s==1?t.duration_1_second.replace(/%s/,s):t.duration_n_seconds.replace(/%s/,s):"";return output}});flowplayer(function(api,root){root=jQuery(root);var hlsjs;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls});api.on("ready",function(e,api){if(hlsjs&&api.conf.playlist.length&&api.engine.engineName!="hlsjs-lite"){hlsjs.destroy()}})});flowplayer(function(api,root){if(!flowplayer.support.browser.safari&&!flowplayer.support.iOS)return;root=jQuery(root);var video_tag=false,did_start_playing=false,are_waiting_already=0;api.on("ready",function(e,api,video){are_waiting_already=0;did_start_playing=false;if(api.engine.engineName=="html5"&&video.src.match(/\?/)){video_tag=root.find("video");if(!video_tag.data("fv-ios-recovery")){video_tag.on("waiting",wait_for_stalled);video_tag.data("fv-ios-recovery",true)}api.one("progress",function(){did_start_playing=true})}});api.bind("beforeseek",wait_for_stalled);function debug(e){console.log("FV PLayer: iOS video element: "+e.type)}function wait_for_stalled(){if(!did_start_playing){return}if(video_tag&&api.engine.engineName=="html5"){are_waiting_already++;if(are_waiting_already>1){if(are_waiting_already>3){console.log("FV PLayer: iOS video element needs a push, triggering 'stalled'");video_tag.trigger("stalled")}return}console.log("FV PLayer: iOS video element will trigger error after 'stalled' arrives");video_tag.one("stalled",function(){var time=api.video.time;if(api.video.type.match(/video\//)){console.log("FV PLayer: Running check of video file...");var test_video=document.createElement("video");test_video.src=api.video.src;test_video.onloadedmetadata=function(){are_waiting_already=0;console.log("FV Player: Video link works")};test_video.onerror=function(){console.log("FV Player: Video link issue!");if(are_waiting_already>0){api.trigger("error",[api,{code:4,video:api.video}])}};return}setTimeout(function(){console.log(api.video.time,time);if(api.video.time!=time){console.log("FV PLayer: iOS video element continues playing, no need for error");return}if(api.paused){console.log("FV PLayer: iOS video element paused, no need for error");return}api.trigger("error",[api,{code:4,video:api.video}])},5e3)})}}});!function(e){var n=!1;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var o=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=o,t}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}function n(o){function t(n,r,i){var c;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(i=e({path:"/"},t.defaults,i)).expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{c=JSON.stringify(r),/^[\{\[]/.test(c)&&(r=c)}catch(e){}r=o.write?o.write(r,n):encodeURIComponent(r+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=(n=(n=encodeURIComponent(n+"")).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var s="";for(var f in i)i[f]&&(s+="; "+f,!0!==i[f]&&(s+="="+i[f]));return document.cookie=n+"="+r+s}n||(c={});for(var p=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,u=0;u<p.length;u++){var l=p[u].split("="),C=l.slice(1).join("=");this.json||'"'!==C.charAt(0)||(C=C.slice(1,-1));try{var m=l[0].replace(d,decodeURIComponent);if(C=o.read?o.read(C,m):o(C,m)||C.replace(d,decodeURIComponent),this.json)try{C=JSON.parse(C)}catch(e){}if(n===m){c=C;break}n||(c[m]=C)}catch(e){}}return c}}return t.set=t,t.get=function(e){return t.call(t,e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(n,o){t(n,"",e(o,{expires:-1}))},t.withConverter=n,t}return n(function(){})});flowplayer.bean.off(document,"keydown.fp");flowplayer(function(api,root){var bean=flowplayer.bean;if(!api.conf.keyboard)return;bean.on(root,"mouseenter mouseleave",function(e){fv_player_focused=!api.disabled&&e.type=="mouseover"?api:0;if(fv_player_focused)fv_player_focusedRoot=root});api.bind("ready",function(e,api,video){if(video.subtitles&&video.subtitles.length>0){var help=jQuery(root).find(".fp-help").html();help+='<div class="fp-help-section fp-help-subtitles"><p><em>c</em>cycle through subtitles</p></div>';jQuery(root).find(".fp-help").html(help)}else{jQuery(root).find(".fp-help-subtitles").remove()}})});flowplayer.bean.on(document,"keydown.fp",function(e){if(typeof fv_player_focused=="undefined")return;var api=fv_player_focused,focusedRoot=api?fv_player_focusedRoot:false,common=flowplayer.common;var el=api&&!api.disabled?api:0,metaKeyPressed=e.ctrlKey||e.metaKey||e.altKey,key=e.which,conf=el&&el.conf;if(common.hasClass(focusedRoot,"no-controlbar")||common.hasClass(focusedRoot,"is-cva"))return;if(!el||!conf.keyboard||el.disabled)return;if([63,187,191].indexOf(key)!=-1){common.toggleClass(focusedRoot,"is-help");return false}if(key==27&&common.hasClass(focusedRoot,"is-help")){common.toggleClass(focusedRoot,"is-help");return false}if(!metaKeyPressed&&el.ready){e.preventDefault();if(e.shiftKey){if(key==39)el.speed(true);else if(key==37)el.speed(false);else if(key==78)el.next();else if(key==80)el.prev();return}if(key<58&&key>47)return el.seekTo(key-48);switch(key){case 38:case 75:el.volume(el.volumeLevel+.15);break;case 40:case 74:el.volume(el.volumeLevel-.15);break;case 39:case 76:el.seeking=true;el.seek(api.video.time+5);break;case 37:case 72:el.seeking=true;el.seek(api.video.time-5);break;case 190:el.seekTo();break;case 32:el.toggle();break;case 70:if(conf.fullscreen)el.fullscreen();break;case 77:el.mute();break;case 81:el.unload();break;case 67:if(!api.video.subtitles||api.video.subtitles.length==0)break;var current_subtitles=jQuery(focusedRoot).find(".fp-dropdown li.active[data-subtitle-index]").data("subtitle-index");if(typeof current_subtitles=="undefined")current_subtitles=-1;current_subtitles++;if(current_subtitles>api.video.subtitles.length-1){current_subtitles=-1}api.trigger("fv-subtitles-switched");if(current_subtitles>-1){el.loadSubtitles(current_subtitles);fv_player_notice(focusedRoot,fv_flowplayer_translations.subtitles_switched+" "+api.video.subtitles[current_subtitles].label,"fv-subtitles-switched")}else{el.disableSubtitles();fv_player_notice(focusedRoot,fv_flowplayer_translations.subtitles_disabled,"fv-subtitles-switched")}break}}});flowplayer(function(api,root){api.bind("load",function(e,api,data){var player=jQuery(e.currentTarget);if(player.data("live")){var live_check=setTimeout(function(){player.find(".fp-ui").append('<div class="fp-message">'+fv_flowplayer_translations.live_stream_failed+"</div>");player.addClass("is-error")},1e4);jQuery(e.currentTarget).data("live_check",live_check)}}).bind("ready",function(e,api,data){clearInterval(jQuery(e.currentTarget).data("live_check"))}).bind("error",function(e,api,data){var player=jQuery(e.currentTarget);if(player.data("live")){player.find(".fp-message").html(fv_flowplayer_translations.live_stream_failed_2)}})});(function($){flowplayer(function(api,root){if(jQuery(root).hasClass("is-cva"))return;$(document).on("submit","#"+jQuery(root).attr("id")+" .mailchimp-form",function(e){e.preventDefault();$(".mailchimp-response",root).remove();$("input[type=submit]",root).attr("disabled","disabled").addClass("fv-form-loading");var data={action:"fv_wp_flowplayer_email_signup"};$("[name]",this).each(function(){data[this.name]=$(this).val()});$.post(fv_player.ajaxurl,data,function(response){response=JSON.parse(response);$('<div class="mailchimp-response"></div>').insertAfter(".mailchimp-form",root);if(response.text.match(/already subscribed/)){response.status="ERROR"}if(response.status==="OK"){$(".mailchimp-form input[type=text],.mailchimp-form input[type=email]",root).val("");$(".mailchimp-response",root).removeClass("is-fv-error").html(response.text);setTimeout(function(){$(".wpfp_custom_popup",root).fadeOut()},2e3)}else{$(".mailchimp-response",root).addClass("is-fv-error").html(response.text)}$("input[type=submit]",root).removeAttr("disabled").removeClass("fv-form-loading")})})})})(jQuery);function fv_flowplayer_mobile_switch(id){var regex=new RegExp("[\\?&]fv_flowplayer_mobile=([^&#]*)");var results=regex.exec(location.search);if((results!=null&&results[1]=="yes"||(jQuery(window).width()<=480||jQuery(window).height()<=480))&&(results==null||results[1]!="no")){var fv_fp_mobile=false;jQuery("#wpfp_"+id+" video source").each(function(){if(jQuery(this).attr("id")!="wpfp_"+id+"_mobile"){fv_fp_mobile=true;jQuery(this).remove()}});if(fv_fp_mobile){jQuery("#wpfp_"+id).after('<p class="fv-flowplayer-mobile-switch">'+fv_flowplayer_translations.mobile_browser_detected_1+' <a href="'+document.URL+'?fv_flowplayer_mobile=no">'+fv_flowplayer_translations.mobile_browser_detected_2+"</a>.</p>")}}}if(typeof fv_flowplayer_mobile_switch_array!="undefined"){for(var i in fv_flowplayer_mobile_switch_array){if(!fv_flowplayer_mobile_switch_array.hasOwnProperty(i))continue;fv_flowplayer_mobile_switch(i)}}flowplayer(function(api,root){if(!flowplayer.support.touch)return;jQuery.fn.fv_single_double_click=function(single_click_callback,double_click_callback,timeout){return this.each(function(){var clicks=0,self=this;jQuery(this).on("click",function(event){clicks++;if(clicks==1){setTimeout(function(){if(clicks==1){single_click_callback.call(self,event)}else{double_click_callback.call(self,event)}clicks=0},timeout||300)}})})};root=jQuery(root);var left=jQuery('<div class="fv-fp-tap-left"><span>-10s</span></div>'),right=jQuery('<div class="fv-fp-tap-right"><span>+10s</span></div>');left.fv_single_double_click(function(){api.toggle()},function(e){maybe_seek(e,left,api.ready?api.video.time-10:false)});right.fv_single_double_click(function(){api.toggle()},function(e){maybe_seek(e,right,api.ready?api.video.time+10:false)});root.find(".fp-ui").append(left).append(right);function maybe_seek(e,el,time){if(api.ready){api.seek(time);animation(el)}else{api.toggle()}e.preventDefault()}function animation(el){el.addClass("is-active");setTimeout(function(){el.removeClass("is-active")},500)}});flowplayer(function(api,root){root=jQuery(root);var instance_id=root.data("flowplayer-instance-id");flowplayer.audible_instance=-1;api.one("load",function(){setTimeout(function(){api.conf.splash=false},0)});api.on("ready",function(){var is_muted=root.data("volume")==0;if(!is_muted){flowplayer.audible_instance=instance_id}jQuery(".flowplayer[data-flowplayer-instance-id]").each(function(){var player=jQuery(this).data("flowplayer");var current_instance_id=jQuery(this).data("flowplayer-instance-id");if(flowplayer.audible_instance==-1||current_instance_id==flowplayer.audible_instance||current_instance_id==instance_id)return;if(player){if(player.ready){if(api.conf.multiple_playback){if(!is_muted){player.mute(true,true)}}else if(player.playing){player.pause()}}else{player.clearLiveStreamCountdown();player.unload()}}})}).on("mute",function(e,api,muted){if(!muted&&flowplayer.audible_instance!=instance_id){flowplayer(flowplayer.audible_instance).mute(true,true);flowplayer.audible_instance=instance_id}}).on("resume",function(){if(!api.conf.multiple_playback){jQuery(".flowplayer[data-flowplayer-instance-id]").each(function(){if(instance_id==jQuery(this).data("flowplayer-instance-id"))return;var player=jQuery(this).data("flowplayer");if(player&&player.playing){player.pause()}})}})});function fv_flowplayer_browser_ff_m4v(hash){if(flowplayer.support.browser&&flowplayer.support.browser.mozilla&&navigator.appVersion.indexOf("Win")!=-1){jQuery("#wpfp_"+hash).attr("data-engine","flash")}}if(typeof fv_flowplayer_browser_ff_m4v_array!="undefined"){for(var i in fv_flowplayer_browser_ff_m4v_array){if(!fv_flowplayer_browser_ff_m4v_array.hasOwnProperty(i))continue;fv_flowplayer_browser_ff_m4v(i)}}function fv_flowplayer_browser_chrome_fail(hash,sAttributes,sVideo,bAutobuffer){jQuery("#wpfp_"+hash).bind("error",function(e,api,error){if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())&&error!=null&&(error.code==3||error.code==4||error.code==5)){api.unload();jQuery("#wpfp_"+hash).attr("id","bad_wpfp_"+hash);jQuery("#bad_wpfp_"+hash).after('<div id="wpfp_'+hash+'" '+sAttributes+' data-engine="flash"></div>');jQuery("#wpfp_"+hash).flowplayer({playlist:[[{mp4:sVideo}]]});if(bAutobuffer){jQuery("#wpfp_"+hash).bind("ready",function(e,api){api.play()})}else{jQuery("#wpfp_"+hash).flowplayer().play(0)}jQuery("#bad_wpfp_"+hash).remove()}})}if(typeof fv_flowplayer_browser_chrome_fail_array!="undefined"){for(var i in fv_flowplayer_browser_chrome_fail_array){if(!fv_flowplayer_browser_chrome_fail_array.hasOwnProperty(i))continue;fv_flowplayer_browser_chrome_fail(i,fv_flowplayer_browser_chrome_fail_array[i]["attrs"],fv_flowplayer_browser_chrome_fail_array[i]["mp4"],fv_flowplayer_browser_chrome_fail_array[i]["auto_buffer"])}}function fv_flowplayer_browser_ie(hash){if(flowplayer.support.browser&&flowplayer.support.browser.msie&&parseInt(flowplayer.support.browser.version,10)>=9||!!navigator.userAgent.match(/Trident.*rv[ :]*11\./)){jQuery("#wpfp_"+hash).attr("data-engine","flash")}}if(typeof fv_flowplayer_browser_ie_array!="undefined"){for(var i in fv_flowplayer_browser_ie_array){if(!fv_flowplayer_browser_ie_array.hasOwnProperty(i))continue;fv_flowplayer_browser_ie(i)}}function fv_flowplayer_browser_chrome_mp4(hash){var match=window.navigator.appVersion.match(/Chrome\/(\d+)\./);if(match!=null){var chrome_ver=parseInt(match[1],10);if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())&&chrome_ver<28&&navigator.appVersion.indexOf("Win")!=-1||/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())&&chrome_ver<27&&navigator.appVersion.indexOf("Linux")!=-1&&navigator.userAgent.toLowerCase().indexOf("android")==-1){jQuery("#wpfp_"+hash).attr("data-engine","flash")}}}if(navigator.platform.indexOf("iPhone")!=-1||navigator.platform.indexOf("iPod")!=-1||navigator.platform.indexOf("iPad")!=-1||navigator.userAgent.toLowerCase().indexOf("android")!=-1){flowplayer(function(api,root){api.bind("error",function(e,api,error){if(error.code==10){jQuery(e.target).find(".fp-message").html(fv_flowplayer_translations.unsupported_format)}})})}jQuery(document).ready(function(){if(navigator.platform.indexOf("iPhone")!=-1||navigator.platform.indexOf("iPod")!=-1||navigator.platform.indexOf("iPad")!=-1){jQuery(window).trigger("load")}jQuery(".flowplayer").on("mouseleave",function(){jQuery(this).find(".fvp-share-bar").removeClass("visible");jQuery(this).find(".embed-code").hide()})});if(!Date.now){Date.now=function(){return(new Date).getTime()}}(function($){var sendPositionsEvery=60,ajaxCall=null,maxCookieSize=2500,localStorageEnabled=null,cookieKeyName="video_positions",tempPositionCookieKeyName="video_positions_tmp",tempSawCookieKeyName="video_saw_tmp",playPositions=[],sawVideo=[],getSerialized=function(data){var serialized=JSON.stringify(data),dataSize=getTextByteSize(serialized);if(dataSize>maxCookieSize){while(dataSize>maxCookieSize){for(var i in data){if(!data.hasOwnProperty(i))continue;delete data[i];serialized=JSON.stringify(data);dataSize=getTextByteSize(serialized);break}}}return serialized},getVideoId=function(video){if(video.id){return video.id}var out=typeof video.sources_original!="undefined"&&typeof video.sources_original[0]!="undefined"?video.sources_original[0].src:video.sources[0].src;if(typeof video.sources_original=="undefined"||typeof video.sources_original[0]=="undefined"){out=removeAWSSignatures(out)}return out},getTextByteSize=function(txt){return encodeURIComponent(txt).length},getCookieKey=function(key){return localStorageEnabled?localStorage.getItem(key):Cookies.get(key)},setCookieKey=function(key,value){return localStorageEnabled?localStorage.setItem(key,value):Cookies.set(key,value)},removeCookieKey=function(key){if(localStorageEnabled){localStorage.removeItem(key)}{Cookies.remove(key)}},removeVideoPosition=function(e,api){if(api.video.sources){var video_id=getVideoId(api.video);playPositions[video_id]=0;sawVideo[video_id]=1}},removeAWSSignatures=function(videoURL){return videoURL.replace(/(X-Amz-Algorithm=[^&]+&?)/gm,"").replace(/(X-Amz-Credential=[^&]+&?)/gm,"").replace(/(X-Amz-Date=[^&]+&?)/gm,"").replace(/(X-Amz-Expires=[^&]+&?)/gm,"").replace(/(X-Amz-SignedHeaders=[^&]+&?)/gm,"").replace(/(X-Amz-Signature=[^&]+&?)/gm,"")},sendVideoPositions=function(async,callback){var beaconSupported="sendBeacon"in navigator;if(async!==true){async=false}if(!callback||typeof callback=="undefined"){callback=function(){}}postData=[];for(var video_name in playPositions){if(!playPositions.hasOwnProperty(video_name))continue;postData.push({name:video_name,position:playPositions[video_name],saw:typeof sawVideo[video_name]!="undefined"?sawVideo[video_name]:false})}if(!postData.length){removeCookieKey(tempPositionCookieKeyName);removeCookieKey(tempSawCookieKeyName);return}if(flowplayer.conf.is_logged_in=="1"){if(beaconSupported){try{var temp_position_data={},temp_saw_data={};for(var i in postData){if(!postData.hasOwnProperty(i))continue;temp_position_data[postData[i].name]=postData[i].position;temp_saw_data[postData[i].name]=postData[i].saw}setCookieKey(tempPositionCookieKeyName,getSerialized(temp_position_data));setCookieKey(tempSawCookieKeyName,getSerialized(temp_saw_data))}catch(e){return}var fd=new FormData;fd.append("action","fv_wp_flowplayer_video_position_save");fd.append("videoTimes",encodeURIComponent(JSON.stringify(postData)));navigator.sendBeacon(fv_player.ajaxurl,fd);return false}else{return jQuery.ajax({type:"POST",async:async,url:fv_player.ajaxurl,complete:callback,data:{action:"fv_wp_flowplayer_video_position_save",videoTimes:postData}})}}else{try{var data=getCookieKey(cookieKeyName);if(data&&typeof data!=="undefined"){data=JSON.parse(data)}else{data={}}for(var i in postData){if(!postData.hasOwnProperty(i))continue;data[postData[i].name]=postData[i].position}var serialized=JSON.stringify(data),dataSize=getTextByteSize(serialized);if(dataSize>maxCookieSize){while(dataSize>maxCookieSize){for(var i in data){if(!data.hasOwnProperty(i))continue;delete data[i];serialized=JSON.stringify(data);dataSize=getTextByteSize(serialized);break}}}setCookieKey(cookieKeyName,serialized)}catch(e){return}}return false};flowplayer(function(api,root){var $root=jQuery(root),enabled=flowplayer.conf.video_position_save_enable&&$root.data("save-position")!="false"||$root.data("save-position"),progressEventsCount=0,seekIntoPosition=function(e,api){if(api.video&&api.video.live)return;var video_id=getVideoId(api.video),position=api.video.position;if(flowplayer.conf.is_logged_in!="1"){var data=getCookieKey(cookieKeyName);if(data&&typeof data!=="undefined"){try{data=JSON.parse(data);if(data[video_id]){position=data[video_id]}}catch(e){return}}}if(!!api.get_custom_end&&api.get_custom_end()<position){position=false}if(!!api.get_custom_start&&api.get_custom_start()>0){if(position<api.get_custom_start()){position=false}}api.bind("progress",storeVideoPosition);if(position){seek(position)}},storeVideoPosition=function(e,api){if(api.live){return}if(api.video.sources){var video_id=getVideoId(api.video),position=Math.round(api.video.time);playPositions[video_id]=position;if(progressEventsCount++>=sendPositionsEvery&&flowplayer.conf.closingPage){if(ajaxCall){ajaxCall.abort()}ajaxCall=sendVideoPositions(true,function(){ajaxCall=null});progressEventsCount=0}}},forceSavePosition=function(e,api){var inPlaylist=false;for(var i in api.conf.playlist){if(!api.conf.playlist.hasOwnProperty(i))continue;inPlaylist=true;break}if(inPlaylist&&!flowplayer.conf.closingPage){progressEventsCount=sendPositionsEvery+1;storeVideoPosition(e,api);sendVideoPositions()}},seek=function(position){if(!!api.custom_seek){api.custom_seek(position);return}var seek_count=0;var do_seek=setInterval(function(){if(++seek_count>20)clearInterval(do_seek);if(api.loading)return;api.seek(parseInt(position));clearInterval(do_seek)},10)},processTempData=function(temp_data_name,video_id){var data=getCookieKey(temp_data_name),output=false;if(data&&typeof data!=="undefined"){try{data=JSON.parse(data);if(typeof data[video_id]!="undefined"){output=data[video_id];delete data[video_id];var stillHasData=false;for(var i in data){if(!data.hasOwnProperty(i))continue;stillHasData=true;break}if(stillHasData){setCookieKey(temp_data_name,JSON.stringify(data))}else{removeCookieKey(temp_data_name)}}return output}catch(e){}}};if(!enabled)return;api.bind("finish",removeVideoPosition);api.one("progress",seekIntoPosition);api.playlist_thumbnail_progress=function(el,video,position){if(!!api.get_custom_start&&api.get_custom_start(video)>0){position-=api.get_custom_start(video);if(position<0)position=0}var duration=video.duration;if(!!api.get_custom_duration&&api.get_custom_duration()>0){duration=api.get_custom_duration()}if(!duration){duration=el.data("duration")}if(!duration)return;var progress=100*position/duration;el.css("width",progress+"%")};if(flowplayer.conf.is_logged_in=="1"){var playlist=api.conf.playlist.length>0?api.conf.playlist:[api.conf.clip],playlist_external=jQuery("[rel="+jQuery(root).attr("id")+"]");for(var i in playlist){if(!playlist.hasOwnProperty(i))continue;var video_id=getVideoId(playlist[i]),position=processTempData(tempPositionCookieKeyName,video_id),saw=processTempData(tempSawCookieKeyName,video_id);if(position){if(api.conf.playlist.length){api.conf.playlist[i].sources[0].position=position;var playlist_progress=jQuery("a",playlist_external).eq(i).find(".fvp-progress");if(playlist_progress.length){api.playlist_thumbnail_progress(playlist_progress,api.conf.playlist[i],position)}}else{api.conf.clip.sources[0].position=position}}if(saw){if(api.conf.playlist.length){api.conf.playlist[i].sources[0].saw=true}else{api.conf.clip.sources[0].saw=true}}}}api.bind("finish",function(e,api){if(api.conf.playlist.length){api.conf.playlist[api.video.index].sources[0].saw=true}else{api.conf.clip.sources[0].saw=true}})});jQuery(window).on("beforeunload pagehide",function(){if(!flowplayer.conf.closingPage){flowplayer.conf.closingPage=true;sendVideoPositions()}});if(localStorageEnabled!==null){return localStorageEnabled}localStorageEnabled=true;try{localStorage.setItem("t","t");if(localStorage.getItem("t")!=="t"){localStorageEnabled=false}localStorage.removeItem("t")}catch(e){localStorageEnabled=false}})(jQuery);flowplayer(function(api,root){root=jQuery(root);if(api.conf.playlist.length==0)return;var real_videos=0;jQuery(api.conf.playlist).each(function(k,v){if(typeof v.click=="undefined"){real_videos++}});if(real_videos<2)return;var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]");var playlist_button=jQuery('<strong class="fv-fp-list">Item 1.</strong>'),playlist_menu=jQuery('<div class="fp-menu fv-fp-list-menu"></div>').insertAfter(root.find(".fp-controls"));var i=0,item_index=[];jQuery(api.conf.playlist).each(function(k,v){if(typeof v.click=="undefined"){playlist_menu.append('<a data-index="'+k+'">'+(i+1)+". "+parse_title(playlist.find("h4").eq(i))+"</a>");item_index.push(k);i++}});playlist_button.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();if(playlist_menu.hasClass("fp-active")){api.hideMenu(playlist_menu[0])}else{root.trigger("click");api.showMenu(playlist_menu[0])}});jQuery("a",playlist_menu).on("click",function(){if(typeof api.conf.playlist[jQuery(this).data("index")-1]!="undefined"&&typeof api.conf.playlist[jQuery(this).data("index")-1].click!="undefined"){api.play(jQuery(this).data("index")-1)}else{api.play(jQuery(this).data("index"))}});api.on("ready",function(e,api,video){playlist_menu.find("a").removeClass("fp-selected");var thumb=playlist_menu.find("a[data-index="+video.index+"]");thumb.addClass("fp-selected");var label=fv_flowplayer_translations.playlist_item_no;label=label.replace(/%d/,item_index.indexOf(api.video.index)+1);label=label.replace(/%s/,parse_title(thumb.find("h4")));playlist_button.html(label)});function parse_title(el){var tmp=el.clone();tmp.find("i.dur").remove();return tmp.text()}});flowplayer(function(api,root){root=jQuery(root);var playlist=api.conf.playlist,videoIndex;api.bind("load",function(e,api,video){videoIndex=video.index});api.bind("error",function(e,api,error){setTimeout(function(){if(playlist.length>0&&api.error==true){videoIndex=api.video.index;if(api.conf.video_checker=="1"&&playlist[videoIndex].video_checker&&playlist[videoIndex].video_checker.length>0){console.log("FV Player: Video checker message present, stopping auto-advance to next playlist item");return false}api.error=api.loading=false;root.removeClass("is-error");root.find(".fp-message.fp-shown").remove();videoIndex++;if(videoIndex>playlist.length-1){videoIndex=0}console.log("FV Player: Playlist item failure, auto-advancing to "+(videoIndex+1)+". item");api.play(videoIndex)}},1e3)})});flowplayer(function(api,root){root=jQuery(root);var original_prev,original_next,random_seed;if(!root.data("button-no-picture")&&!root.data("button-repeat")&&!root.data("button-rewind"))return;api.bind("ready",function(e,api){if(typeof original_next=="undefined"&&typeof original_prev=="undefined"){original_next=api.next;original_prev=api.prev}if(!api.video.type.match(/^audio/)&&root.data("button-no-picture")&&root.find(".fv-fp-no-picture").length==0){var button_no_picture=jQuery('<span class="fv-fp-no-picture"><svg viewBox="0 0 90 80" width="18px" height="18px" class="fvp-icon fvp-nopicture"><use xlink:href="#fvp-nopicture"></use></svg></span>');button_no_picture.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();jQuery(".fp-engine",root).slideToggle(20);jQuery(this).toggleClass("is-active fp-color-fill")})}if(root.data("button-repeat")){if(api.conf.playlist.length>0&&root.find(".fv-fp-playlist").length==0){var t=fv_flowplayer_translations,playlist_button=jQuery('<strong class="fv-fp-playlist mode-normal"> <svg viewBox="0 0 80.333 80" width="18px" height="18px" class="fvp-icon fvp-replay-list"><title>'+t.playlist_replay_all+'</title><use xlink:href="#fvp-replay-list"></use></svg> <svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-shuffle"><title>'+t.playlist_shuffle+'</title><use xlink:href="#fvp-shuffle"></use></svg> <svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-replay-track"><title>'+t.playlist_replay_video+'</title><use xlink:href="#fvp-replay-track"></use></svg> <span id="fvp-playlist-play" title="'+t.playlist_play_all+'">'+t.playlist_play_all_button+"</span> </strong>"),playlist_menu=jQuery('<div class="fp-menu fv-fp-playlist-menu"> <a data-action="repeat_playlist"><svg viewBox="0 0 80.333 80" width="18px" height="18px" class="fvp-icon fvp-replay-list"><title>'+t.playlist_replay_all+'</title><use xlink:href="#fvp-replay-list"></use></svg> <span class="screen-reader-text">'+t.playlist_replay_all+'</span></a> <a data-action="shuffle_playlist"><svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-shuffle"><title>'+t.playlist_shuffle+'</title><use xlink:href="#fvp-shuffle"></use></svg> <span class="screen-reader-text">'+t.playlist_shuffle+'</span></a> <a data-action="repeat_track"><svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-replay-track"><title>'+t.playlist_replay_video+'</title><use xlink:href="#fvp-replay-track"></use></svg> <span class="screen-reader-text">'+t.playlist_replay_video+'</span></a> <a class="fp-selected" data-action="normal"><span id="fvp-playlist-play" title="'+t.playlist_play_all+'">'+t.playlist_play_all_button+"</span></a> </div>").insertAfter(root.find(".fp-controls"));api.conf.playlist_shuffle=api.conf.track_repeat=false;random_seed=randomize();var should_advance=api.conf.advance;playlist_button.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();if(playlist_menu.css("right")!=="auto"){playlist_menu.css({right:"auto",left:playlist_button.position().left+"px"})}if(playlist_menu.hasClass("fp-active")){api.hideMenu(playlist_menu[0])}else{root.trigger("click");api.showMenu(playlist_menu[0])}});jQuery("a",playlist_menu).on("click",function(){jQuery(this).siblings("a").removeClass("fp-selected");jQuery(this).addClass("fp-selected");playlist_button.removeClass("mode-normal mode-repeat-track mode-repeat-playlist mode-shuffle-playlist");var action=jQuery(this).data("action");if(action=="repeat_playlist"){playlist_button.addClass("mode-repeat-playlist");api.conf.loop=true;api.conf.advance=true;api.video.loop=api.conf.track_repeat=false;api.conf.playlist_shuffle=false}else if(action=="shuffle_playlist"){playlist_button.addClass("mode-shuffle-playlist");api.conf.loop=true;api.conf.advance=true;api.conf.playlist_shuffle=true}else if(action=="repeat_track"){playlist_button.addClass("mode-repeat-track");api.conf.track_repeat=api.video.loop=true;api.conf.loop=api.conf.playlist_shuffle=false}else if(action=="normal"){playlist_button.addClass("mode-normal");api.conf.track_repeat=api.video.loop=false;api.conf.loop=api.conf.playlist_shuffle=false}if(api.conf.playlist_shuffle){api.next=function(){api.play(random_seed.pop());if(random_seed.length==0)random_seed=randomize()};api.prev=function(){api.play(random_seed.shift());if(random_seed.length==0)random_seed=randomize()}}else{api.next=original_next;api.prev=original_prev}});if(api.conf.loop){jQuery("a[data-action=repeat_playlist]",playlist_menu).trigger("click")}api.on("progress",function(){api.video.loop=api.conf.track_repeat});api.on("finish.pl",function(e,api){console.log("playlist_repeat",api.conf.loop,"advance",api.conf.advance,"video.loop",api.video.loop);if(api.conf.playlist_shuffle){api.play(random_seed.pop());if(random_seed.length==0)random_seed=randomize()}})}else if(root.find(".fv-fp-track-repeat").length==0&&api.conf.playlist.length==0){var button_track_repeat=jQuery('<strong class="fv-fp-track-repeat"><svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-replay-track"><use xlink:href="#fvp-replay-track"></use></svg></strong>');button_track_repeat.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();jQuery(this).toggleClass("is-active fp-color-fill",api.video.loop);if(api.video.loop){api.video.loop=false}else{api.video.loop=true}});if(api.conf.loop){button_track_repeat.addClass("is-active fp-color-fill")}}}if(root.data("button-rewind")){if(root.find(".fv-fp-rewind").length==0){var button_rewind=jQuery('<span class="fv-fp-rewind"><svg viewBox="0 0 24 24" width="21px" height="21px" class="fvp-icon fvp-rewind"><use xlink:href="#fvp-rewind"></use></svg></span>');button_rewind.insertBefore(root.find(".fp-controls .fp-playbtn")).on("click",function(e){e.preventDefault();e.stopPropagation();api.seek(api.video.time-10)});button_rewind.toggle(!api.video.live)}if(root.find(".fv-fp-forward").length==0){var button_forward=jQuery('<span class="fv-fp-forward"><svg viewBox="0 0 24 24" width="21px" height="21px" class="fvp-icon fvp-forward"><use xlink:href="#fvp-forward"></use></svg></span>');button_forward.insertAfter(root.find(".fp-controls .fp-playbtn")).on("click",function(e){e.preventDefault();e.stopPropagation();api.seek(api.video.time+10)});button_forward.toggle(!api.video.live)}}}).bind("unload",function(){root.find(".fv-fp-no-picture").remove();root.find(".fv-fp-playlist").remove();root.find(".fv-fp-track-repeat").remove()});function array_shuffle(a){var j,x,i;for(i=a.length;i;i--){j=Math.floor(Math.random()*i);x=a[i-1];a[i-1]=a[j];a[j]=x}return a}function randomize(random_seed){random_seed=[];jQuery(api.conf.playlist).each(function(k,v){random_seed.push(k)});random_seed=array_shuffle(random_seed);console.log("FV Player Randomizer random seed:",random_seed);return random_seed}});flowplayer(function(api,root){var $root=jQuery(root),start_index=$root.data("playlist_start");if(typeof start_index=="undefined")return;function start_position_changer(){if($root.data("position_changed")!==1&&api.conf.playlist.length){start_index--;api.play(start_index);$root.data("position_changed",1)}}api.bind("unload",function(){start_index=$root.data("playlist_start");$root.removeData("position_changed");api.one("ready",start_position_changer);api.video.index=0});api.one("ready",start_position_changer);jQuery(".fp-ui",root).on("click",function(){start_position_changer();$root.data("position_changed",1)})});document.addEventListener("custombox:overlay:close",function(e){console.log("FV Player: Custombox/Popup anything ligtbox closed");var $players=jQuery(this).find(".flowplayer");if($players.length==0)return;console.log("FV Player: Custombox/Popup anything ligtbox contains a player");$players.each(function(index,player){var api=jQuery(player).data("flowplayer");if(typeof api!="undefined"){if(api.playing){console.log("FV Player: Custombox/Popup anything ligtbox video pause");api.pause()}else if(api.loading){api.one("ready",function(){console.log("FV Player: Custombox/Popup anything ligtbox video unload");api.unload()})}}})});flowplayer(function(api,root){api.bind("finish",function(){var finished_at=api.video.time;if(api.video.loop){api.one("pause",function(){if(finished_at<=api.video.time){api.resume()}})}})});function fv_flowplayer_amazon_s3(hash,time){jQuery("#wpfp_"+hash).bind("error",function(e,api,error){var fv_fp_date=new Date;if(error.code==4&&fv_fp_date.getTime()>fv_fp_utime+parseInt(time)){jQuery(e.target).find(".fp-message").delay(500).queue(function(n){jQuery(this).html(fv_flowplayer_translations.video_expired);n()})}})}flowplayer(function(api,root){root=jQuery(root);root.find(".fp-logo").removeAttr("href");if(root.hasClass("no-controlbar")){var timelineApi=api.sliders.timeline;timelineApi.disable(true);api.bind("ready",function(){timelineApi.disable(true)})}jQuery(".fvfp_admin_error",root).remove();root.find(".fp-logo, .fp-header").on("click",function(e){if(e.target!==this)return;root.find(".fp-ui").trigger("click")});jQuery(".fvp-share-bar .sharing-facebook",root).append('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="#fff"><title>Facebook</title><path d="M11.9 5.2l-2.6 0 0-1.6c0-0.7 0.3-0.7 0.7-0.7 0.3 0 1.6 0 1.6 0l0-2.9 -2.3 0c-2.6 0-3.3 2-3.3 3.3l0 2 -1.6 0 0 2.9 1.6 0c0 3.6 0 7.8 0 7.8l3.3 0c0 0 0-4.2 0-7.8l2.3 0 0.3-2.9Z"/></svg>');jQuery(".fvp-share-bar .sharing-twitter",root).append('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="#fff"><title>Twitter</title><path d="M16 3.1c-0.6 0.3-1.2 0.4-1.9 0.5 0.7-0.4 1.2-1 1.4-1.8 -0.6 0.4-1.3 0.6-2.1 0.8 -0.6-0.6-1.4-1-2.4-1 -2 0.1-3.2 1.6-3.2 4 -2.7-0.1-5.1-1.4-6.7-3.4 -0.9 1.4 0.2 3.8 1 4.4 -0.5 0-1-0.1-1.5-0.4l0 0.1c0 1.6 1.1 2.9 2.6 3.2 -0.7 0.2-1.3 0.1-1.5 0.1 0.4 1.3 1.6 2.2 3 2.3 -1.6 1.7-4.6 1.4-4.8 1.3 1.4 0.9 3.2 1.4 5 1.4 6 0 9.3-5 9.3-9.3 0-0.1 0-0.3 0-0.4 0.6-0.4 1.2-1 1.6-1.7Z"/></svg>');jQuery(".fvp-share-bar .sharing-email",root).append('<svg xmlns="http://www.w3.org/2000/svg" height="16" viewBox="0 0 16 16" width="16" fill="#fff"><title>Email</title><path d="M8 10c0 0 0 0-1 0L0 6v7c0 1 0 1 1 1h14c1 0 1 0 1-1V6L9 10C9 10 8 10 8 10zM15 2H1C0 2 0 2 0 3v1l8 4 8-4V3C16 2 16 2 15 2z"/></svg>');jQuery(".fp-header",root).prepend(jQuery(".fvp-share-bar",root));if(api.conf.playlist.length){var show=true;var playlist=api.conf.playlist;if(playlist.length==2){if(typeof playlist[0].click!="undefined"&&typeof playlist[1].click=="undefined"){show=false}if(typeof playlist[0].click=="undefined"&&typeof playlist[1].click!="undefined"){show=false}}else if(playlist.length==3){if(typeof playlist[0].click!="undefined"&&typeof playlist[1].click=="undefined"&&typeof playlist[2].click!="undefined"){show=false}}if(show){var prev=jQuery('<a class="fp-icon fv-fp-prevbtn"></a>');var next=jQuery('<a class="fp-icon fv-fp-nextbtn"></a>');root.find(".fp-controls .fp-playbtn").before(prev).after(next);prev.on("click",function(){api.trigger("prev",[api]);api.prev()});next.on("click",function(){api.trigger("next",[api]);api.next()})}}api.bind("pause resume finish unload ready",function(e,api){root.addClass("no-brand")});api.one("ready",function(){root.find(".fp-fullscreen").clone().appendTo(root.find(".fp-controls"))});api.bind("ready",function(e,api,video){setTimeout(function(){jQuery(".fvp-share-bar",root).show();jQuery(".fv-player-buttons-wrap",root).appendTo(jQuery(".fv-player-buttons-wrap",root).parent().find(".fp-ui"))},100)});api.bind("finish",function(){var url=root.data("fv_redirect");if(url&&(typeof api.video.is_last=="undefined"||api.video.is_last)){location.href=url}});if(flowplayer.support.iOS&&flowplayer.support.iOS.version==11){api.bind("error",function(e,api,error){if(error.code==4)root.find(".fp-engine").hide()})}jQuery(document).on("contextmenu",".flowplayer",function(e){e.preventDefault()});api.one("ready",function(e,api,video){root.find(".fp-chromecast").insertAfter(root.find(".fp-header .fp-fullscreen"))});root.find(".fp-waiting").html('<div class="fp-preload"><b></b><b></b><b></b><b></b></div>');var id=root.attr("id"),alternative=!flowplayer.conf.native_fullscreen&&flowplayer.conf.mobile_alternative_fullscreen,events_enter="fakefullscreen",events_exit="fakefullscreen-exit";if(!flowplayer.support.fullscreen){events_enter+=" fullscreen";events_exit+=" fullscreen-exit"}api.bind(events_enter,function(e,api){jQuery("#wpadminbar, .nc_wrapper").hide();if(alternative||e.type=="fakefullscreen"){if(api.video.type=="video/youtube")return;root.before('<span data-fv-placeholder="'+id+'"></span>');root.appendTo("body")}});api.bind(events_exit,function(e,api,video){jQuery("#wpadminbar, .nc_wrapper").show();if(alternative||e.type=="fakefullscreen-exit"){jQuery("span[data-fv-placeholder="+id+"]").replaceWith(root)}})});(function(){var extension=function(flowplayer){flowplayer(function(api,root){if(!jQuery(root).data("speedb"))return;var support=flowplayer.support;if(!support.video||!support.inlineVideo)return;var common=flowplayer.common,bean=flowplayer.bean,ui=common.find(".fp-ui",root)[0],controlbar=common.find(".fp-controls",ui)[0],speeds=api.conf.speeds;bean.on(root,"click",".fp-speed",function(){var menu=common.find(".fp-speed-menu",root)[0];if(common.hasClass(menu,"fp-active"))api.hideMenu();else api.showMenu(menu)});bean.on(root,"click",".fp-speed-menu a",function(ev){var s=ev.target.getAttribute("data-speed");api.speed(s)});api.on("speed",function(ev,_a,rate){if(speeds.length>1){selectSpeed(rate)}}).on("ready",function(ev,api){removeMenu();if(flowplayer.support.android&&api.engine.engineName=="html5"&&api.video.type=="application/x-mpegurl")return;speeds=api.conf.speeds;if(speeds.length>1){createMenu()}});function removeMenu(){common.find(".fp-speed-menu",root).forEach(common.removeNode);common.find(".fp-speed",root).forEach(common.removeNode)}function round(val){return Math.round(val*100)/100}function createMenu(){controlbar.appendChild(common.createElement("strong",{className:"fp-speed"},api.currentSpeed+"x"));var menu=common.createElement("div",{className:"fp-menu fp-speed-menu",css:{width:"auto"}},"<strong>Speed</strong>");speeds.forEach(function(s){var a=common.createElement("a",{"data-speed":round(s)},round(s)+"x");menu.appendChild(a)});ui.appendChild(menu);selectSpeed(api.currentSpeed);jQuery(root).find(".fp-speed-menu strong").text(fv_flowplayer_translations.speed)}function selectSpeed(rate){common.find(".fp-speed",root)[0].innerHTML=rate+"x";common.find(".fp-speed-menu a",root).forEach(function(el){common.toggleClass(el,"fp-selected",el.getAttribute("data-speed")==rate);common.toggleClass(el,"fp-color",el.getAttribute("data-speed")==rate)})}})};if(typeof module==="object"&&module.exports)module.exports=extension;else if(typeof window.flowplayer==="function")extension(window.flowplayer)})();flowplayer(function(api,root){api.on("speed",function(ev,_a,rate){try{window.localStorage.fv_player_speed=rate}catch(e){}});api.on("ready",function(){if(window.localStorage.fv_player_speed&&jQuery(root).find("strong.fp-speed").is(":visible")){api.speed(parseFloat(window.localStorage.fv_player_speed))}if(jQuery(root).data("volume")==0){api.mute(true,true)}})});flowplayer(function(api,root){root=jQuery(root);var last_tracked=-1;if(!api.conf.fv_stats||!api.conf.fv_stats.enabled&&(!root.data("fv_stats")||root.data("fv_stats")=="no"))return;api.on("ready finish",function(e,api){api.one("progress",function(e,api){if(root.data("fv_stats_data")){try{var player_post_data=root.data("fv_stats_data")}catch(e){return false}if(last_tracked==get_index())return;last_tracked=get_index();jQuery.post(api.conf.fv_stats.url,{blog_id:api.conf.fv_stats.blog_id,video_id:api.video.id?api.video.id:0,player_id:player_post_data.player_id,post_id:player_post_data.post_id,tag:"play"})}})}).on("finish",function(){last_tracked=-1});function get_index(){return api.video.index?api.video.index:0}});flowplayer(function(api,root){var $root=jQuery(root);var $playerDiv=$root.find(".fp-player");var sticky=$root.data("fvsticky");var globalSticky=false;var videoRatio=$root.data("ratio"),is_sticky=false;if(typeof videoRatio=="undefined"){videoRatio=.5625}if(flowplayer.conf.sticky_video==1&&typeof sticky=="undefined"){globalSticky=true}if(globalSticky||sticky){if(flowplayer.support.firstframe){var stickyPlace=flowplayer.conf.sticky_place;var stickyWidth=flowplayer.conf.sticky_width;if(stickyWidth==""){stickyWidth=380}var stickyHeight=stickyWidth*videoRatio;fv_player_sticky_video()}else{return}}function fv_player_sticky_video(){var change=false;var $window=jQuery(window),$flowplayerDiv=$root,top=$flowplayerDiv.offset().top,offset=Math.floor(top+$flowplayerDiv.outerHeight()/2);api.on("ready",function(){change=true});api.on("progress",function(){change=true});api.on("unload",function(){change=false;fv_player_sticky_class_remove();$root.removeClass("is-unSticky")});$window.on("resize",function(){if(!is_big_enough()){if(is_sticky){fv_player_sticky_class_remove()}return}top=$flowplayerDiv.offset().top;offset=Math.floor(top+$flowplayerDiv.outerHeight()/2)}).on("scroll",function(){if(!is_big_enough()){if(is_sticky){fv_player_sticky_class_remove()}return}top=$flowplayerDiv.offset().top;offset=Math.floor(top+$flowplayerDiv.outerHeight()/2);if($window.scrollTop()>offset&&change){if(jQuery("div.flowplayer.is-unSticky").length>0){console.log("unSticky",jQuery("div.flowplayer.is-unSticky").length);return false}else{fv_player_sticky_class_add()}}else{fv_player_sticky_class_remove();change=false}})}function fv_player_sticky_class_add(){if($playerDiv.hasClass("is-sticky-"+stickyPlace)){return}else{$playerDiv.addClass("is-sticky-"+stickyPlace);if($root.find("a.fp-sticky").length==0){$root.find("div.fp-header").prepend('<a class="fp-sticky fp-icon"></a>')}$playerDiv.css("width",stickyWidth);$playerDiv.css("height",stickyHeight);$playerDiv.css("max-height",stickyHeight);is_sticky=true;api.trigger("sticky",[api])}$playerDiv.parent(".flowplayer").addClass("is-stickable")}function fv_player_sticky_class_remove(){$playerDiv.removeClass("is-sticky-"+stickyPlace);$playerDiv.css("width","");$playerDiv.css("height","");$playerDiv.css("max-height","");$playerDiv.parent(".flowplayer").removeClass("is-stickable");if(is_sticky){is_sticky=false;api.trigger("sticky-exit",[api])}}function is_big_enough(){return jQuery(window).innerWidth()>=1020}});jQuery(function($){$(document).on("click","a.fp-sticky",function(){$("div.flowplayer.is-stickable").addClass("is-unSticky");var $playerDiv=$("div.flowplayer.is-stickable").find(".fp-player");$playerDiv.removeClass("is-sticky-right-bottom");$playerDiv.removeClass("is-sticky-left-bottom");$playerDiv.removeClass("is-sticky-right-top");$playerDiv.removeClass("is-sticky-left-top");$playerDiv.css("width","");$playerDiv.css("height","");$playerDiv.css("max-height","");if(is_sticky){is_sticky=false;api.trigger("sticky-exit",[api])}});$(document).on("click","div.flowplayer.is-unSticky",function(){$("div.flowplayer").removeClass("is-unSticky")})});flowplayer(function(api,root){root=jQuery(root);var ls=window.localStorage;api.on("ready",function(e,api,video){if(root.find("strong.fp-cc").is(":visible")){if(ls.fv_player_subtitle&&api.video.subtitles.length){if(ls.fv_player_subtitle==="none"){api.disableSubtitles()}else{api.video.subtitles.forEach(function(item,index){if(item.srclang===ls.fv_player_subtitle){api.loadSubtitles(index)}})}}else{var defaultSubtitle=video.subtitles.filter(function(one){return one["fv_default"]})[0];if(defaultSubtitle){api.loadSubtitles(video.subtitles.indexOf(defaultSubtitle))}}}root.find(".fp-subtitle-menu").on("click",function(e){var subtitle_index=e.target.getAttribute("data-subtitle-index");if(typeof subtitle_index=="string"){try{ls.fv_player_subtitle=subtitle_index>-1?api.video.subtitles[subtitle_index].srclang:"none"}catch(e){}}})})});flowplayer(function(api,root){root=jQuery(root);var currentPoint,check=false;api.bind("cuepoint",function(e,api,cue){check=false;if(cue.subtitle){currentPoint=cue.index}});api.on("ready",function(e,api){root.find(".fp-subtitle-menu strong").text(fv_flowplayer_translations.closed_captions);root.find('.fp-subtitle-menu a[data-subtitle-index="-1"]').text(fv_flowplayer_translations.no_subtitles)});root.on("click",".fp-subtitle-menu a[data-subtitle-index]",function(e){if(jQuery(this).data("subtitle-index")>-1){check=true;api.on("progress",time_check)}});function time_check(e,api,time){if(check){(api.cuepoints||[]).forEach(function(cue,index){var entry=cue.subtitle;if(entry&&currentPoint!=index){if(time>=cue.time&&(!entry.endTime||time<=entry.endTime)){api.trigger("cuepoint",[api,cue])}}})}}});if(typeof flowplayer!=="undefined"&&typeof fv_flowplayer_conf!="undefined"&&fv_flowplayer_conf.video_hash_links){flowplayer(function(api,root){if(jQuery(root).find(".sharing-link").length>0){var abEnd,abStart,hash,sTime,abloop;function update_link(abStartNew,abEndNew){hash=fv_player_get_video_link_hash(api);sTime=","+fv_player_time_hms(api.video.time);if(abStartNew&&abEndNew){abStart=","+fv_player_time_hms_ms(abStartNew+api.get_custom_start());abEnd=","+fv_player_time_hms_ms(abEndNew+api.get_custom_start())}else{abEnd=abloop&&typeof api.get_ab_end()!="undefined"&&api.get_ab_end()?","+fv_player_time_hms_ms(api.get_ab_end()):"";abStart=abloop&&typeof api.get_ab_start()!="undefined"&&api.get_ab_start()?","+fv_player_time_hms_ms(api.get_ab_start()):""}jQuery(".sharing-link",root).attr("href",jQuery(".sharing-link",root).attr("href").replace(/#.*/,"")+"#"+hash+sTime+abStart+abEnd)}api.on("ready",function(e,api,video){if(!api.fv_noUiSlider)return;api.fv_noUiSlider.on("set",function(values){update_link(values[0],values[1])})});api.on("progress",function(e,api){if(!api.video.sources||!api.video.sources[0]){return}update_link()});api.on("abloop",function(e,api,active){abloop=active;if(!api.playing){update_link()}});jQuery(".sharing-link",root).on("click",function(e){fv_player_clipboard(jQuery(this).attr("href"),function(){e.preventDefault();fv_player_notice(root,fv_flowplayer_translations.link_copied,2e3)})})}});jQuery(document).on("click",'a[href*="fvp_"]',function(){var link=jQuery(this);setTimeout(function(){if(link.parents(".fvp-share-bar").length==0)fv_autoplay_exec()})})}flowplayer(function(api,root){root=jQuery(root);var bean=flowplayer.bean;var restore=-1;root.on("click",".fp-volumebtn",function(e){if(api.volumeLevel==0&&restore!=-1){api.volume(restore);return false}});root.on("mousedown touchstart mouseup touchend",".fp-volumebar",function(e){if(api.volumeLevel!=0){restore=api.volumeLevel}});root.on("mousedown touchstart",".fp-volumebtn",function(e){if(api.volumeLevel>0){restore=-1}});api.on("volume",function(e,api){if(root.hasClass("is-mouseover")&&!api.muted){if(api.volumeLevel==0){bean.off(flowplayer.support.touch?root:document,"mousemove.sld touchmove.sld");api.mute(true)}}});var deal_with_muted_start=false;api.on("ready",function(e,api){if(root.hasClass("is-audio"))return;deal_with_muted_start=true});api.on("progress",function(e,api,time){if(deal_with_muted_start&&time>1){deal_with_muted_start=false;var video=jQuery("root").find("video");if(video.length&&!hasAudio(video[0])){return}if(api.muted||api.volumeLevel==0){if(localStorage.muted=="true"||localStorage.volume=="0"){return}var mute_notice=jQuery('<div class="fp-message fp-message-muted fp-shown"><span class="fp-icon fp-volumebtn-notice"></span> '+fv_flowplayer_translations.click_to_unmute+"</div>");mute_notice.on("click touchstart",function(){api.mute(false);api.volume(1)});root.find(".fp-ui").append(mute_notice);root.addClass("has-fp-message-muted")}}});api.on("mute volume",function(){if(!api.muted||api.volumeLevel>0){remove_volume_notice()}});function remove_volume_notice(){root.removeClass("has-fp-message-muted");root.find(".fp-message-muted").remove()}function hasAudio(video){return video.mozHasAudio||Boolean(video.webkitAudioDecodedByteCount)||Boolean(video.audioTracks&&video.audioTracks.length)}});if(typeof flowplayer!="undefined"){flowplayer(function(api,root){root=jQuery(root);if(navigator.userAgent.match(/iPhone.* OS [0-6]_/i)){api.one("progress",function(e){if(typeof api.video.subtitles!=="undefined"&&api.video.subtitles.length){fv_player_warning(root,fv_flowplayer_translations.warning_iphone_subs)}})}if(flowplayer.support.android&&flowplayer.support.android.version<5&&(flowplayer.support.android.samsung||flowplayer.support.browser.safari)){fv_player_warning(root,fv_flowplayer_translations.warning_unstable_android,"firefox")}if(/Android 4/.test(navigator.userAgent)&&!/Firefox/.test(navigator.userAgent)){api.on("ready",function(e,api,video){setTimeout(function(){if(video.src&&video.src.match(/fpdl.vimeocdn.com/)&&(video.time==0||video.time==1)){fv_player_warning(root,fv_flowplayer_translations.warning_unstable_android,"firefox");api.on("progress",function(e,api){root.prev().find(".fv-player-warning-firefox").remove()})}},1500)});api.on("error",function(e,api,error){if(error.MEDIA_ERR_NETWORK==2&&error.video.src.match(/fpdl.vimeocdn.com/)){fv_player_warning(root,fv_flowplayer_translations.warning_unstable_android,"firefox")}})}if(/Safari/.test(navigator.userAgent)&&/Version\/5/.test(navigator.userAgent)){api.on("error",function(e,api,error){if(error.video.src.match(/fpdl.vimeocdn.com/)){fv_player_warning(root,fv_flowplayer_translations.warning_old_safari)}})}var sup=flowplayer.support;if(sup.android&&(sup.android.samsung&&parseInt(sup.browser.version)<66||sup.browser.safari)){api.on("error",function(e,api,error){fv_player_warning(root,fv_flowplayer_translations.warning_samsungbrowser,"warning_samsungbrowser")})}});function fv_player_warning(root,warning,classname){var wrapper=jQuery(root).prev(".fv-player-warning-wrapper");if(wrapper.length==0){jQuery(root).before('<div class="fv-player-warning-wrapper">');wrapper=jQuery(root).prev(".fv-player-warning-wrapper")}if(wrapper.find(".fv-player-warning-"+classname).length==0){var latest=jQuery("<p style='display: none' "+(classname?" class='fv-player-warning-"+classname+"'":"")+">"+warning+"</p>");wrapper.append(latest);latest.slideDown()}}}
1
+ if(typeof fv_flowplayer_conf!="undefined"){try{if(typeof window.localStorage=="object"&&typeof window.localStorage.volume!="undefined"){delete fv_flowplayer_conf.volume}}catch(e){}flowplayer.conf=fv_flowplayer_conf;flowplayer.conf.fullscreen=false;flowplayer.conf.chromecast=false;flowplayer.conf.embed=false;flowplayer.conf.share=false;flowplayer.conf.analytics=false;if(typeof fv_flowplayer_conf.disable_localstorage!="undefined"){flowplayer.conf.storage={}}try{flowplayer.conf.key=atob(flowplayer.conf.key)}catch(e){}if(!flowplayer.support.android&&flowplayer.conf.dacast_hlsjs){function FVAbrController(hls){this.hls=hls;this.nextAutoLevel=3}FVAbrController.prototype.nextAutoLevel=function(nextLevel){this.nextAutoLevel=nextLevel};FVAbrController.prototype.destroy=function(){};flowplayer.conf.hlsjs={startLevel:-1,abrController:FVAbrController}}function parseIOSVersion(UA){var e=/iP(ad|hone)(; CPU)? OS (\d+_\d)/.exec(UA);if(e&&e.length>1){return parseFloat(e[e.length-1].replace("_","."),10)}return 0}if(flowplayer.support.iOS&&flowplayer.support.iOS.chrome&&flowplayer.support.iOS.version==0){flowplayer.support.iOS.version=parseIOSVersion(navigator.userAgent)}if(flowplayer.support.iOS&&parseInt(flowplayer.support.iOS.version)>=13||!flowplayer.support.iOS&&flowplayer.support.browser.safari&&parseInt(flowplayer.support.browser.version)>=8){flowplayer.conf.hlsjs.safari=true}flowplayer.support.fvmobile=!!(!flowplayer.support.firstframe||flowplayer.support.iOS||flowplayer.support.android);var fls=flowplayer.support;if(flowplayer.conf.mobile_native_fullscreen&&"ontouchstart"in window&&fls.fvmobile){flowplayer.conf.native_fullscreen=true}if("ontouchstart"in window){if(fls.android&&fls.android.version<4.4&&!(fls.browser.chrome&&fls.browser.version>54)){flowplayer.conf.native_fullscreen=true}if(fls.iOS&&(fv_player_in_iframe()||fls.iOS.version<7)){flowplayer.conf.native_fullscreen=true}}}if(typeof fv_flowplayer_translations!="undefined"){flowplayer.defaults.errors=fv_flowplayer_translations}var fv_player_did_autoplay=false;function fv_player_videos_parse(args,root){try{var videos=JSON.parse(args)}catch(e){return false}var regex=new RegExp("[\\?&]fv_flowplayer_mobile=([^&#]*)");var results=regex.exec(location.search);if((results!=null&&results[1]=="yes"||(jQuery(window).width()<=480||jQuery(window).height()<=480))&&(results==null||results[1]!="no")){var fv_fp_mobile=false;jQuery(videos.sources).each(function(k,v){if(v.mobile){videos.sources[k]=videos.sources[0];videos.sources[0]=v;fv_fp_mobile=true}if(fv_fp_mobile){jQuery(root).after('<p class="fv-flowplayer-mobile-switch">'+fv_flowplayer_translations.mobile_browser_detected_1+' <a href="'+document.URL+'?fv_flowplayer_mobile=no">'+fv_flowplayer_translations.mobile_browser_detected_2+"</a>.</p>")}})}root.trigger("fv_player_videos_parse",videos);return videos}function fv_player_in_iframe(){try{return window.self!==window.top}catch(e){return true}}jQuery(document).ready(function(){var loading_count=0;var loading=setInterval(function(){loading_count++;if(loading_count<1e3&&(window.fv_video_intelligence_conf&&!window.FV_Player_IMA||window.fv_vast_conf&&!window.FV_Player_IMA||window.fv_player_pro&&!window.FV_Flowplayer_Pro&&document.getElementById("fv_player_pro")!=fv_player_pro||window.fv_player_user_playlists&&!fv_player_user_playlists.is_loaded||window.FV_Player_JS_Loader_scripts_total&&window.FV_Player_JS_Loader_scripts_loaded<FV_Player_JS_Loader_scripts_total)){return}clearInterval(loading);fv_player_preload()},10)});function fv_escape_attr(text){var map={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return text.replace(/[&<>"']/g,function(m){return map[m]})}function fv_player_preload(){if(flowplayer.support.touch){jQuery(".fp-playlist-external.fv-playlist-design-2017").addClass("visible-captions")}flowplayer(function(api,root){if(localStorage.flowplayerTestStorage){delete localStorage.flowplayerTestStorage}root=jQuery(root);var fp_player=root.find(".fp-player");var splash_click=false;if(root.hasClass("fixed-controls")){root.find(".fp-controls").on("click",function(e){if(!api.loading&&!api.ready){e.preventDefault();e.stopPropagation();api.load()}})}if(!flowplayer.support.volume&&!flowplayer.support.autoplay){root.find(".fp-volume").hide()}if(root.data("volume")==0&&root.hasClass("no-controlbar")){root.find(".fp-volume").remove()}var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]");if((!api.conf.playlist||api.conf.playlist.length==0)&&playlist.length&&playlist.find("a[data-item]").length>0){var items=[];playlist.find("a[data-item]").each(function(){if(parsed=fv_player_videos_parse(jQuery(this).attr("data-item"),root)){items.push(parsed)}else{jQuery(this).remove()}});api.conf.playlist=items;api.conf.clip=items[0]}else if(!api.conf.clip){api.conf.clip=fv_player_videos_parse(jQuery(root).attr("data-item"),root)}jQuery("a",playlist).on("click",function(e){e.preventDefault();splash_click=true;var $this=jQuery(this),playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]"),index=jQuery("a",playlist).index(this);$prev=$this.prev("a"),item=$this.data("item");if(location.href.match(/wp-admin/)&&$this.parents(".fv-player-editor-preview").length>0){fv_flowplayer_conf.current_video_to_edit=index;$this.parents(".fv-player-custom-video").find(".edit-video .fv-player-editor-button").trigger("click");return false}if($prev.length&&$this.is(":visible")&&!$prev.is(":visible")){$prev.trigger("click");return false}if(jQuery("#"+$this.parent().attr("rel")).hasClass("dynamic-playlist"))return;var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]");fv_player_playlist_active(playlist,this);if(api){if(api.error){api.pause();api.error=api.loading=false;root.removeClass("is-error");root.find(".fp-message.fp-shown").remove()}if(!api.video||api.video.index==index)return;api.play(index)}var new_splash=item.splash;if(!new_splash){new_splash=$this.find("img").attr("src")}player_splash(root,fp_player,item,new_splash);var rect=root[0].getBoundingClientRect();if(rect.bottom-100<0){jQuery("html, body").animate({scrollTop:jQuery(root).offset().top-100},300)}});var playlist_external=jQuery("[rel="+root.attr("id")+"]");var playlist_progress=false;var splash_img=root.find(".fp-splash");var splash_text=root.find(".fv-fp-splash-text");function player_splash(root,fp_player,item,new_splash){var splash_img=root.find("img.fp-splash");if(new_splash){if(splash_img.length==0){splash_img=jQuery('<img class="fp-splash" />');fp_player.prepend(splash_img)}splash_img.attr("alt",item.fv_title?fv_escape_attr(item.fv_title):"video");splash_img.attr("src",new_splash)}else if(splash_img.length){splash_img.remove()}}api.bind("load",function(e,api,video){if(!api.conf.playlist.length){return}if(video.type.match(/^audio/)&&!splash_click){var anchor=playlist_external.find("a").eq(video.index);var item=anchor.data("item");var new_splash=item.splash;if(!new_splash){new_splash=anchor.find("img").attr("src")}player_splash(root,fp_player,item,new_splash)}splash_click=false});api.bind("ready",function(e,api,video){setTimeout(function(){if(video.index>-1){if(playlist_external.length>0){var playlist_item=jQuery("a",playlist_external).eq(video.index);fv_player_playlist_active(playlist_external,playlist_item);playlist_progress=playlist_item.find(".fvp-progress")}}},100);splash_img=root.find(".fp-splash");if(!video.is_audio_stream&&!video.type.match(/^audio/)){splash_img.remove();splash_text.remove()}});api.bind("unload",function(){jQuery(".fp-playlist-external .now-playing").remove();jQuery(".fp-playlist-external a").removeClass("is-active");var iframe=fp_player.find("iframe.fp-engine");if(iframe.length){iframe.after(splash_text);iframe.after(splash_img)}else{fp_player.prepend(splash_text);fp_player.prepend(splash_img)}playlist_progress=false});api.bind("progress",function(e,api,time){if(playlist_progress.length){api.playlist_thumbnail_progress(playlist_progress,api.video,time)}});api.bind("error-subtitles",function(){console.log("error-subtitles");fv_player_notice(root,fv_flowplayer_translations[8],2e3)});var playlist=jQuery(root).parent().find("div.fp-playlist-vertical[rel="+jQuery(root).attr("id")+"]");if(playlist.length){function check_size_and_all(args){var property=playlist.hasClass("fp-playlist-only-captions")?"height":"max-height";if(playlist.parents(".fp-playlist-text-wrapper").hasClass("is-fv-narrow")){property="max-height"}playlist.css(property,vertical_playlist_height());if(property=="max-height")playlist.css("height","auto")}check_size_and_all();jQuery(window).on("resize tabsactivate",function(){setTimeout(check_size_and_all,0)})}function vertical_playlist_height(args){var height=root.height();if(height==0)height=root.css("max-height");return height}api.show_status=function(type){var status="";["loading","ready","playing","paused","seeking"].every(function(v,k){if(api[v])status+=" "+v;return true});console.log("FV Player Status ("+type+")",status)};if(!window.fv_player_loaded){window.fv_player_loaded=true;setTimeout(function(){jQuery(document).trigger("fv_player_loaded");var event=new CustomEvent("fv_player_loaded",[]);document.dispatchEvent(event)},100)}setTimeout(function(){root.trigger("fv_player_loaded")},10)});if(window.self!=window.top&&!location.href.match(/fv_player_preview/)){embed_size();jQuery(window.self).resize(embed_size)}function embed_size(){jQuery(".flowplayer.fp-is-embed").each(function(){var root=jQuery(this);if(!root.hasClass("has-chapters")&&!root.hasClass("has-transcript")&&jQuery(".fp-playlist-external[rel="+root.attr("id")+"]").length==0){root.height(jQuery(window).height())}})}if(typeof fv_flowplayer_playlists!="undefined"){for(var i in fv_flowplayer_playlists){if(!fv_flowplayer_playlists.hasOwnProperty(i))continue;jQuery("#"+i).flowplayer({playlist:fv_flowplayer_playlists[i]})}}fv_player_load();fv_autoplay_exec();jQuery(document).ajaxComplete(function(){fv_player_load()});jQuery(window).on("hashchange",fv_autoplay_exec)}function fv_player_load(forced_el){if(forced_el&&forced_el.lenght>1){console.log("FV Player: Can't use fv_player_load with more than a single forced element!")}var load_players=forced_el,forced_api=false;if(!load_players)load_players=jQuery(".flowplayer");load_players.each(function(i,el){var root=jQuery(el);var api=root.data("flowplayer");if(api){if(forced_el)forced_api=api;return}if(forced_el){root.find(".fp-preload, .fvfp_admin_error").remove();if(root.attr("data-item-lazy")){root.attr("data-item",root.attr("data-item-lazy"));root.removeAttr("item-lazy")}else if(playlist=jQuery("[rel="+root.attr("id")+"]")){playlist.find("a[data-item-lazy]").each(function(k,v){v=jQuery(v);v.attr("data-item",v.attr("data-item-lazy"));v.removeAttr("data-item-lazy")})}}var conf=false;if(root.attr("data-item")){conf={clip:fv_player_videos_parse(root.attr("data-item"),root)}}else if(playlist=jQuery("[rel="+root.attr("id")+"]")){if(playlist.find("a[data-item]").length==0)return;var items=[];playlist.find("a[data-item]").each(function(){if(parsed=fv_player_videos_parse(jQuery(this).attr("data-item"),root)){items.push(parsed)}else{jQuery(this).remove()}});conf={playlist:items}}if(conf){conf=flowplayer.extend(conf,root.data());forced_api=flowplayer(root[0],conf);root.data("flowplayer",forced_api)}});jQuery(".fv-playlist-slider-wrapper").each(function(i,el){var items=jQuery(this).find("a");jQuery(this).find(".fp-playlist-external").css("width",items.outerWidth()*items.length)});if(typeof jQuery().tabs!="undefined"){jQuery("body").removeClass("fv_flowplayer_tabs_hide");jQuery(".fv_flowplayer_tabs_content").tabs()}if(forced_el&&forced_api){return forced_api}}function fv_player_playlist_active(playlist,item){if(playlist){jQuery("a",playlist).removeClass("is-active");jQuery(".now-playing").remove()}$playlist=jQuery(playlist);$item=jQuery(item);var scroll_parent=false;$item.addClass("is-active");var is_design_2014=$playlist.hasClass("fv-playlist-design-2014");if((is_design_2014&&$item.find("h4").length==0||!is_design_2014)&&$item.find(".now-playing").length==0)$item.prepend('<strong class="now-playing"><span>'+fv_flowplayer_translations.playlist_current+"</span></strong>");if(!$playlist.parent().find(".flowplayer").length){scroll_parent=true}if(($playlist.hasClass("fp-playlist-vertical")||$playlist.hasClass("fp-playlist-horizontal")&&$playlist.hasClass("is-audio"))&&!fullyVisibleY($item.get(0))){var $el=scroll_parent?$playlist.parent():$playlist;$el.animate({scrollTop:$el.scrollTop()+($item.position().top-$el.position().top)},750)}else if($playlist.hasClass("fp-playlist-horizontal")&&!fullyVisibleX($item.get(0))){var $el=scroll_parent?$playlist.parent():$playlist;$el.animate({scrollLeft:$el.scrollLeft()+($item.position().left-$el.position().left)},750)}function fullyVisibleY(el){var rect=el.getBoundingClientRect(),top=rect.top,height=rect.height,bottom=top+height,el=el.parentNode;do{rect=el.getBoundingClientRect();if(bottom<=rect.bottom===false)return false;if(top<=rect.top)return false;el=el.parentNode}while(el!=document.body);return bottom<=document.documentElement.clientHeight}function fullyVisibleX(el){var rect=el.getBoundingClientRect(),left=rect.left,width=rect.width,right=left+width,el=el.parentNode;do{rect=el.getBoundingClientRect();if(right<=rect.right===false)return false;if(left<=rect.left)return false;el=el.parentNode}while(el!=document.body);return right<=document.documentElement.clientWidth}}var fv_fp_date=new Date;var fv_fp_utime=fv_fp_date.getTime();function fv_parse_sharelink(src){src=src.replace("https?://[^./].","");var prefix="fvp_";if(src.match(/(youtube.com)/)){return prefix+src.match(/(?:v=)([A-Za-z0-9_-]*)/)[1]}else if(src.match(/(vimeo.com)|(youtu.be)/)){return prefix+src.match(/(?:\/)([^/]*$)/)[1]}else{var match=src.match(/(?:\/)([^/]*$)/);if(match){return prefix+match[1].match(/^[^.]*/)[0]}}return prefix+src}function fv_player_get_video_link_hash(api){var hash=fv_parse_sharelink(typeof api.video.sources_original!="undefined"&&typeof api.video.sources_original[0]!="undefined"?api.video.sources_original[0].src:api.video.sources[0].src);if(typeof api.video.id!="undefined"){hash=fv_parse_sharelink(api.video.id.toString())}return hash}function fv_player_time_hms(seconds){if(isNaN(seconds)){return NaN}var sec_num=parseInt(seconds,10);var hours=Math.floor(sec_num/3600);var minutes=Math.floor(sec_num/60)%60;var seconds=sec_num%60;if(hours){hours+="h"}else{hours=""}if(hours&&minutes<10){minutes="0"+minutes+"m"}else if(minutes){minutes+="m"}else{minutes=""}if((hours||minutes)&&seconds<10){seconds="0"+seconds}seconds+="s";var timeString=hours+minutes+seconds;return timeString}function fv_player_time_hms_ms(seconds){if(isNaN(seconds)){return NaN}seconds=parseFloat(seconds).toFixed(3);var miliseconds=(seconds+"").split(".");if(typeof miliseconds[1]!="undefined"&&miliseconds[1]>0){miliseconds=miliseconds[1]+"ms"}else{miliseconds=""}var timeString=fv_player_time_hms(seconds)+miliseconds;return timeString}function fv_player_time_seconds(time,duration){if(!time)return-1;var seconds=0;var match=time.match(/(\d+[a-z]{1,2})/g);match.forEach(function(item){if(item.endsWith("h")){seconds+=3600*parseInt(item)}else if(item.endsWith("m")){seconds+=60*parseInt(item)}else if(item.endsWith("s")&&!item.endsWith("ms")){seconds+=parseInt(item)}else if(item.endsWith("ms")){if(parseInt(item)){seconds+=parseInt(item)/1e3}}});return duration?Math.min(seconds,duration):seconds}function fv_autoplay_init(root,index,time,abStart,abEnd){if(fv_autoplay_exec_in_progress)return;fv_autoplay_exec_in_progress=true;var api=root.data("flowplayer");if(!api)return;var fTime=fv_player_time_seconds(time);abEnd=fv_player_time_seconds(abEnd);abStart=fv_player_time_seconds(abStart);if(root.parent().hasClass("ui-tabs-panel")){var tabId=root.parent().attr("id");jQuery("[aria-controls="+tabId+"] a").trigger("click")}if(!root.find(".fp-player").attr("class").match(/\bis-sticky/)){var offset=jQuery(root).offset().top-(jQuery(window).height()-jQuery(root).height())/2;window.scrollTo(0,offset);api.one("ready",function(){window.scrollTo(0,offset)})}if(root.hasClass("lightboxed")){setTimeout(function(){jQuery("[href=\\#"+root.attr("id")+"]").trigger("click")},0)}if(index){if(fv_player_video_link_autoplay_can(api,parseInt(index))){if(api.ready){fv_player_video_link_seek(api,fTime)}else{api.play(parseInt(index));api.one("ready",function(){fv_player_video_link_seek(api,fTime,abEnd,abStart)})}}else if(flowplayer.support.inlineVideo){api.one(api.playing?"progress":"ready",function(e,api){api.play(parseInt(index));api.one("ready",function(){fv_player_video_link_seek(api,fTime,abEnd,abStart)})});root.find(".fp-splash").attr("src",jQuery("[rel="+root.attr("id")+"] div").eq(index).find("img").attr("src"));if(!fv_player_in_iframe()){fv_player_notice(root,fv_flowplayer_translations[11],"progress")}}}else{if(api.ready){fv_player_video_link_seek(api,fTime)}else{if(fv_player_video_link_autoplay_can(api)){api.load()}else if(!fv_player_in_iframe()){fv_player_notice(root,fv_flowplayer_translations[11],"progress")}api.one("ready",function(){fv_player_video_link_seek(api,fTime,abEnd,abStart)})}}}function fv_player_video_link_seek(api,fTime,abEnd,abStart){fv_autoplay_exec_in_progress=false;var do_seek=setInterval(function(){if(api.loading)return;if(fTime>0||api.video.time>0){if(!!api.custom_seek){api.custom_seek(fTime)}else{api.seek(fTime)}}if(abEnd&&abStart)api.trigger("link-ab",[api,abStart,abEnd]);clearInterval(do_seek)},10)}var fv_autoplay_exec_in_progress=false;function fv_autoplay_exec(){var autoplay=true;if(typeof flowplayer!=="undefined"&&typeof fv_flowplayer_conf!="undefined"&&fv_flowplayer_conf.video_hash_links&&window.location.hash.substring(1).length){var aHash=window.location.hash.match(/\?t=/)?window.location.hash.substring(1).split("?t="):window.location.hash.substring(1).split(",");var hash=aHash[0];var time=aHash[1]===undefined?false:aHash[1];var abStart=aHash[2]===undefined?false:aHash[2];var abEnd=aHash[3]===undefined?false:aHash[3];jQuery(".flowplayer").each(function(){var root=jQuery(this);if(root.hasClass("lightbox-starter")){root=jQuery(root.attr("href"))}var api=root.data("flowplayer");if(!api)return;var playlist=typeof api.conf.playlist!=="undefined"&&api.conf.playlist.length>1?api.conf.playlist:[api.conf.clip];for(var item in playlist){if(!playlist.hasOwnProperty(item))continue;var id=typeof playlist[item].id!=="undefined"?fv_parse_sharelink(playlist[item].id.toString()):false;if(hash===id&&autoplay){console.log("fv_autoplay_exec for "+id,item);fv_autoplay_init(root,parseInt(item),time,abStart,abEnd);autoplay=false;return false}}for(var item in playlist){if(!playlist.hasOwnProperty(item))continue;var src=fv_parse_sharelink(playlist[item].sources[0].src);if(hash===src&&autoplay){console.log("fv_autoplay_exec for "+src,item);fv_autoplay_init(root,parseInt(item),time,abStart,abEnd);autoplay=false;return false}}})}if(autoplay&&flowplayer.support.firstframe){jQuery(".flowplayer[data-fvautoplay]").each(function(){var root=jQuery(this),api=root.data("flowplayer"),autoplay=root.attr("data-fvautoplay");if(!fv_player_did_autoplay&&autoplay){if((flowplayer.support.android||flowplayer.support.iOS)&&api&&api.conf.clip.sources[0].type=="video/youtube"){console.log("FV Player: Autoplay for YouTube not supported on Android and iOS");return}else{fv_player_did_autoplay=true;if(api.conf.playlist.length&&!isNaN(parseFloat(autoplay))&&isFinite(autoplay)){api.play(parseInt(autoplay))}else{api.load()}var play_icon=root.find(".fp-play").addClass("invisible"),control_bar=root.find(".fp-controls").addClass("invisible");api.one("progress",function(){play_icon.removeClass("invisible");control_bar.removeClass("invisible")});if(autoplay=="muted"){api.mute(true,true)}}}})}}function fv_player_video_link_autoplay_can(api,item){var video=item?api.conf.playlist[item]:api.conf.clip;if(video.sources[0].type=="video/youtube"&&(flowplayer.support.iOS||flowplayer.support.android)||fv_player_in_iframe())return false;return flowplayer.support.firstframe}function fv_player_notice(root,message,timeout){var notices=jQuery(".fvfp-notices",root);if(!notices.length){notices=jQuery('<div class="fvfp-notices">');jQuery(".fp-player",root).append(notices)}var notice=jQuery('<div class="fvfp-notice-content">'+message+"</div></div>");notices.append(notice);if(typeof timeout=="string"){var player=jQuery(root).data("flowplayer");player.on(timeout,function(){notice.fadeOut(100,function(){jQuery(this).remove()})})}if(timeout>0){setTimeout(function(){notice.fadeOut(2e3,function(){jQuery(this).remove()})},timeout)}return notice}var fv_player_clipboard=function(text,successCallback,errorCallback){try{fv_player_doCopy(text);successCallback()}catch(e){if(typeof errorCallback!="undefined")errorCallback(e)}};function fv_player_doCopy(text){var textarea=document.createElement("textarea");textarea.value=text;textarea.style.opacity=0;textarea.style.position="absolute";textarea.setAttribute("readonly",true);document.body.appendChild(textarea);var selected=document.getSelection().rangeCount>0?document.getSelection().getRangeAt(0):false;if(navigator.userAgent.match(/ipad|ipod|iphone/i)){var editable=textarea.contentEditable;textarea.contentEditable=true;var range=document.createRange();range.selectNodeContents(textarea);var sel=window.getSelection();sel.removeAllRanges();sel.addRange(range);textarea.setSelectionRange(0,999999);textarea.contentEditable=editable}else{textarea.select()}try{var result=document.execCommand("copy");if(selected){document.getSelection().removeAllRanges();document.getSelection().addRange(selected)}document.body.removeChild(textarea);return result}catch(err){throw new Error("Unsuccessfull")}}flowplayer(function(api,root){root=jQuery(root);if(typeof api.conf.disable_localstorage!="undefined"){return}var hlsjs;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls;hlsjs.on(Hls.Events.ERROR,function(event,data){if(data.type=="mediaError"&&data.details=="fragParsingError"&&data.fatal==true){hlsjs.destroy();api.trigger("error",[api,{code:3}]);setTimeout(function(){root.removeClass("is-seeking");root.addClass("is-paused")},0)}});if(flowplayer.support.browser.safari){hlsjs.on(Hls.Events.KEY_LOADED,function(event){if(event=="hlsKeyLoaded"){setTimeout(function(){if(api.loading){console.log("FV Player: Safari stuck loading HLS, resuming playback...");api.resume()}},0)}})}var pick_quality=flowplayer.conf.hd_streaming&&!flowplayer.support.fvmobile?720:false;if(jQuery(params.root).data("hd_streaming")==false)pick_quality=false;if(localStorage.FVPlayerHLSQuality)pick_quality=localStorage.FVPlayerHLSQuality;if(pick_quality){hlsjs.on(Hls.Events.MANIFEST_PARSED,function(_,data){var found=false;jQuery.each(data.levels,function(k,v){if(v.height==pick_quality)found=k});if(!localStorage.FVPlayerHLSQuality&&!found){jQuery.each(data.levels,function(k,v){if(v.height>found)found=k})}if(found){console.log("FV Player: Picked "+data.levels[found].height+"p quality");hlsjs.startLevel=found;hlsjs.currentLevel=found}})}});root=jQuery(root);var search=document.location.search;if(localStorage.FVPlayerDashQuality){if(!api.conf.dash)api.conf.dash={};api.conf.dash.initialVideoQuality="restore"}root.on("click",".fp-qsel-menu a",function(){if(api.engine.engineName=="hlsjs-lite"){var quality=jQuery(this).data("quality");if(quality==-1){localStorage.removeItem("FVPlayerHLSQuality")}else{var level=hlsjs.levels[quality];localStorage.FVPlayerHLSQuality=level.height}}});if(localStorage.FVPlayerHLSQuality){api.conf.hlsjs.startLevel=parseInt(localStorage.FVPlayerHLSQuality);api.conf.hlsjs.testBandwidth=false;api.conf.hlsjs.autoLevelEnabled=false}else if(flowplayer.conf.hd_streaming&&!flowplayer.support.fvmobile){api.conf.hlsjs.startLevel=3;api.conf.hlsjs.testBandwidth=false;api.conf.hlsjs.autoLevelEnabled=false}api.bind("quality",function(e,api,quality){if(api.engine.engineName=="dash"){if(quality==-1){localStorage.removeItem("FVPlayerDashQuality")}else if(bitrates[quality]){localStorage.FVPlayerDashQuality=bitrates[quality].height}}});var bitrates=[];var last_quality=-1;api.bind("ready",function(e,api){root.find(".fp-qsel-menu strong").text(fv_flowplayer_translations.quality);if(api.engine.engineName=="dash"){bitrates=api.engine.dash.getBitrateInfoListFor("video");if(localStorage.FVPlayerDashQuality&&api.conf.dash.initialVideoQuality){api.quality(api.conf.dash.initialVideoQuality)}quality_sort()}else if(api.engine.engineName=="hlsjs-lite"){root.addClass("is-loading");api.loading=true;api.one("progress",function(){if(api.loading){root.removeClass("is-loading");api.loading=false}});if(api.video.qualities&&api.video.qualities.length>2){var qswitch=-1;if(localStorage.FVPlayerHLSQuality){jQuery(api.video.qualities).each(function(k,v){if(v.value==localStorage.FVPlayerHLSQuality){qswitch=localStorage.FVPlayerHLSQuality;return false}})}else if(flowplayer.conf.hd_streaming&&!flowplayer.support.fvmobile){jQuery(api.video.qualities).each(function(k,v){var height=parseInt(v.label);if(height>0&&qswitch==-1&&height>=720&&height<=720){qswitch=v.value}})}qswitch=parseInt(qswitch);if(qswitch>-1){root.one("progress",function(){setTimeout(function(){api.quality(qswitch)})})}quality_sort()}}else if(api.video.sources_fvqs&&api.video.sources_fvqs.length>0&&api.video.src.match(/vimeo.*?\.mp4/)){setTimeout(quality_sort,0)}root.find("a[data-quality]").removeClass("is-current")});if(search.match(/dash_debug/)||search.match(/hls_debug/))var debug_log=jQuery('<div class="fv-debug" style="background: gray; color: white; top: 10%; position: absolute; z-index: 1000">').appendTo(root.find(".fp-player"));api.bind("ready progress",quality_process);api.bind("quality",function(){setTimeout(quality_process,0)});function quality_process(){if(api.engine.engineName=="dash"){var stream_info=bitrates[api.engine.dash.getQualityFor("video")];if(stream_info.qualityIndex!=last_quality){last_quality=stream_info.qualityIndex;quality_label(stream_info.qualityIndex,bitrates)}if(search.match(/dash_debug/))quality_debug(stream_info.width,stream_info.height,stream_info.bitrate)}else if(api.engine.engineName=="hlsjs-lite"){if(hlsjs.currentLevel!=last_quality){last_quality=hlsjs.currentLevel;quality_label(hlsjs.currentLevel,hlsjs.levels)}if(search.match(/hls_debug/)){var level=hlsjs.levels[hlsjs.currentLevel];if(level){quality_debug(level.width,level.height,level.bitrate)}}}}function quality_label(index,qualities){if(!qualities[index])return;var height=qualities[index].height,hd_limit=541,lowest=1e5;jQuery(qualities).each(function(k,v){if(v.height>=720&&v.height<1400)hd_limit=720;if(v.height<lowest)lowest=v.height;if(localStorage.FVPlayerHLSQuality==v.height){root.find("a[data-quality]").removeClass("fp-selected fp-color");root.find("a[data-quality="+k+"]").addClass("fp-selected fp-color")}});root.find("a[data-quality]").removeClass("is-current");root.find("a[data-quality="+index+"]").addClass("is-current");var label="SD";if(height>=360&&lowest<height)label="SD";if(height>=hd_limit)label="HD";if(height>=1400)label="4K";root.find(".fp-qsel").html(label)}function quality_debug(w,h,br){debug_log.html("Using "+w+"x"+h+" at "+Math.round(br/1024)+" kbps")}function quality_sort(){var menu=root.find(".fp-qsel-menu");menu.children().each(function(i,a){menu.prepend(a)});menu.children().each(function(i,a){if(/^NaNp/.test(jQuery(a).html())){var bitrate=jQuery(a).html().match(/\((.*?)\)/);if(bitrate&&typeof bitrate[1]!=="undefined"){jQuery(a).html(bitrate[1])}}else{jQuery(a).html(jQuery(a).html().replace(/\(.*?\)/,""))}});menu.prepend(menu.find("a[data-quality=-1]"));menu.prepend(menu.find("strong"))}});flowplayer(function(api,root){root=jQuery(root);var player_id=root.attr("id"),ad=false;if(root.data("end_popup_preview")){jQuery(document).ready(function(){api.trigger("finish",[api])})}function ad_height_check(){var count=0;var ad_height_check=setInterval(function(){var height=ad&&ad.find(".adsbygoogle").height();count++;if(count>20*10||height>0)clearInterval(ad_height_check);if(height>root.height()){ad.addClass("tall-ad")}},50)}function show_ad(){var ad_data=root.attr("data-ad");if(typeof ad_data!="undefined"&&ad_data.length){try{ad_data=JSON.parse(ad_data)}catch(e){return false}if(!ad&&!root.hasClass("is-cva")&&root.width()>=parseInt(ad_data.width)){var html=ad_data.html;html=html.replace("%random%",Math.random());ad=jQuery('<div id="'+player_id+'_ad" class="wpfp_custom_ad">'+html+"</div>");root.find(".fp-player").append(ad);ad_height_check();setTimeout(function(){if(root.find(".wpfp_custom_ad video").length){api.pause()}},500)}}}function show_popup(event){var popup_data=root.attr("data-popup");if(typeof popup_data!="undefined"&&popup_data.length){try{popup_data=JSON.parse(popup_data)}catch(e){return false}if(event=="finish"||popup_data.pause||popup_data.html.match(/fv-player-ppv-purchase-btn-wrapper/)){root.addClass("is-popup-showing");root.find(".fp-player").append('<div id="'+player_id+'_custom_popup" class="wpfp_custom_popup">'+popup_data.html+"</div>")}}}api.bind("ready",function(e,api){if(ad.length==1){ad.remove();ad=false}if(!root.data("ad_show_after")){show_ad()}}).bind("progress",function(e,api,current){if(current>root.data("ad_show_after")){show_ad()}}).bind("finish",function(e,api){if(typeof api.video.index=="undefined"||api.video.index+1==api.conf.playlist.length){show_popup(e.type)}}).bind("pause",function(e,api){show_popup(e.type)}).bind("resume unload seek",function(e,api){if(root.hasClass("is-popup-showing")){root.find(".wpfp_custom_popup").remove();root.removeClass("is-popup-showing")}})});jQuery(document).on("click",".fv_fp_close",function(){var ad=jQuery(this).parents(".wpfp_custom_ad_content"),video=ad.find("video");ad.fadeOut();if(video.length)video[0].pause();return false});jQuery(document).on("focus",".fv_player_popup input[type=text], .fv_player_popup input[type=email], .fv_player_popup textarea",function(){var api=jQuery(this).parents(".flowplayer").data("flowplayer");if(api)api.disable(true)});jQuery(document).on("blur",".fv_player_popup input[type=text], .fv_player_popup input[type=email], .fv_player_popup textarea",function(){var api=jQuery(this).parents(".flowplayer").data("flowplayer");if(api)api.disable(false)});flowplayer(function(api,root){api.on("ready",function(e,api,video){api.one("progress",function(){jQuery(root).find(".fp-airplay").toggle(api.engine.engineName=="html5")})})});flowplayer(function(api,root){var root=jQuery(root),bean=flowplayer.bean,time=0,last=0,timer,event_name;if(typeof ga=="undefined"&&api.conf.fvanalytics&&typeof _gat=="undefined"&&typeof gtag=="undefined"){if(is_ga_4(api)){jQuery.getScript({url:"https://www.googletagmanager.com/gtag/js?id="+api.conf.fvanalytics,cache:true},function(){window.dataLayer=window.dataLayer||[];window.gtag=function(){window.dataLayer.push(arguments)};window.gtag("js",new Date);window.gtag("config",api.conf.fvanalytics)})}else{jQuery.getScript({url:"https://www.google-analytics.com/analytics.js",cache:true},function(){ga("create",api.conf.fvanalytics,"auto")})}}if(!window._paq&&api.conf.matomo_domain&&api.conf.matomo_site_id){var u="//"+api.conf.matomo_domain+"/";var _paq=window._paq=window._paq||[];_paq.push(["setTrackerUrl",u+"matomo.php"]);_paq.push(["setSiteId",api.conf.matomo_site_id]);var d=document,g=d.createElement("script"),s=d.getElementsByTagName("script")[0];g.type="text/javascript";g.async=true;g.src=u+"matomo.js";s.parentNode.insertBefore(g,s)}api.bind("progress",function(e,api,current){fv_track(e,api,current)}).bind("finish ready ",function(e,api){for(var j in fv_ga_events){if(!fv_ga_events.hasOwnProperty(j))continue;root.removeData("fv_track_"+fv_ga_events[j])}}).bind("error",function(e,api,error){setTimeout(function(){if(!api.error)return;var video=typeof api.video!="undefined"&&typeof api.video.src!="undefined"?api.video:false;if(!video&&typeof api.conf.clip!="undefined"&&typeof api.conf.clip.sources!="undefined"&&typeof api.conf.clip.sources[0]!="undefined"&&typeof api.conf.clip.sources[0].src!="undefined")video=api.conf.clip.sources[0];var name=fv_player_track_name(root,video);if(name&&!name.match(/\/\/vimeo.com\/\d/)){if(is_ga_4(api)){}else{fv_player_track(api,false,"Video "+(root.hasClass("is-cva")?"Ad ":"")+"error",error.message,name)}}},100)});api.bind("load unload",fv_track_seconds_played).bind("progress",function(e,api){if(!api.seeking){time+=last?+new Date-last:0;last=+new Date}if(!timer){timer=setTimeout(function(){timer=null;if(!is_ga_4(api)){fv_player_track(api,false,"Flowplayer heartbeat",api.engine.engineName+"/"+api.video.type,"Heartbeat",0)}},10*60*1e3)}}).bind("pause",function(){last=0});api.bind("shutdown",function(){bean.off(window,"unload",fv_track_seconds_played)});bean.on(window,"unload",fv_track_seconds_played);var fv_ga_events=is_ga_4(api)?["Play","25 Percent Played","50 Percent Played","75 Percent Played","100 Percent Played"]:["start","first quartile","second quartile","third quartile","complete"];function fv_track_seconds_played(e,api_not_needed,video){video=video||api.video;if(e.type==="load"){event_name=fv_player_track_name(root,video)}if(time){fv_player_track(api,false,"Video / Seconds played",api.engine.engineName+"/"+api.video.type,event_name,Math.round(time/1e3));time=0;if(timer){clearTimeout(timer);timer=null}}}function fv_track(e,api,data){var video=api.video,dur=video.duration,i=0;var name=fv_player_track_name(root,video);if(dur){if(data>19*dur/20)i=4;else if(data>3*dur/4)i=3;else if(data>dur/2)i=2;else if(data>dur/4)i=1}if(api.live)i=0;if(root.data("fv_track_"+fv_ga_events[i]))return;for(var j in fv_ga_events){if(!fv_ga_events.hasOwnProperty(j))continue;if(j==i)break;if(!root.data("fv_track_"+fv_ga_events[j]))return}root.trigger("fv_track_"+fv_ga_events[i].replace(/ /,"_"),[api,name]);root.data("fv_track_"+fv_ga_events[i],true);fv_player_track(api,false,"Video "+(root.hasClass("is-cva")?"Ad ":"")+fv_ga_events[i],api.engine.engineName+"/"+video.type,name)}api.get_time_played=function(){return time/1e3}});function is_ga_4(api){if(typeof api.conf.fvanalytics!="undefined"&&api.conf.fvanalytics&&api.conf.fvanalytics.startsWith("G-"))return true;return false}function fv_player_track(api,ga_id,event,engineType,name,value){if(!ga_id)ga_id=flowplayer.conf.fvanalytics;if(typeof engineType=="undefined")engineType="Unknown engine";if(/fv_player_track_debug/.test(window.location.href))console.log("FV Player Track: "+event+" - "+engineType+" '"+name+"'",value);if(typeof gtag!="undefined"){if(is_ga_4(api)){gtag("event",event,{video_current_time:api.video.time,video_provider:engineType,video_duration:api.video.duration,value:value?value:1})}else{gtag("event",event,{event_category:engineType,event_label:name,value:value?value:1})}}else if(ga_id&&typeof ga!="undefined"){ga("create",ga_id,"auto",name,{allowLinker:true});ga("require","linker");if(value){ga("send","event",event,engineType,name,value)}else{ga("send","event",event,engineType,name)}}else if(ga_id&&typeof _gat!="undefined"){var tracker=_gat._getTracker(ga_id);if(typeof tracker._setAllowLinker=="undefined"){return}tracker._setAllowLinker(true);if(value){tracker._trackEvent(event,engineType,name,value)}else{tracker._trackEvent(event,engineType,name)}}if(flowplayer.conf.matomo_domain&&flowplayer.conf.matomo_site_id&&typeof _paq!="undefined"){if(value){_paq.push(["trackEvent",event,engineType,name,value])}else{_paq.push(["trackEvent",event,engineType,name])}}}function fv_player_track_name(root,video){var name=root.attr("title");if(!name&&typeof video.fv_title!="undefined")name=video.fv_title;if(!name&&typeof video.title!="undefined")name=video.title;if(!name&&typeof video.src!="undefined"){name=video.src.split("/").slice(-1)[0].replace(/\.(\w{3,4})(\?.*)?$/i,"");if(video.type.match(/mpegurl/))name=video.src.split("/").slice(-2)[0].replace(/\.(\w{3,4})(\?.*)?$/i,"")+"/"+name}return name}flowplayer(function(api,root){root=jQuery(root);var player=root.find(".fp-player"),had_no_volume=root.hasClass("no-volume"),had_fp_mute=root.hasClass("fp-mute"),had_fp_full=root.hasClass("fp-full"),buttons_count=0;function check_size(){var width=player.width()||root.width(),video_index=api.video.index?api.video.index:0;if(width>900){jQuery(".fp-subtitle",root).addClass("is-wide")}else{jQuery(".fp-subtitle",root).removeClass("is-wide")}root.toggleClass("is-tiny",width<400);root.toggleClass("is-small",width<600&&width>=400);var too_narrow=width<480+buttons_count*35;if(typeof api.fv_timeline_chapters_data!="undefined"&&typeof api.fv_timeline_chapters_data[video_index]!="undefined"){too_narrow=true}if(!had_fp_full){root.toggleClass("fp-full",root.hasClass("has-abloop")||too_narrow)}var size="";if(width<400)size="is-tiny";else if(width<600&&width>=400)size="is-small";root.trigger("fv-player-size",[size]);var el=player;if(root.parent().hasClass("fp-playlist-vertical-wrapper")||root.parent().hasClass("fp-playlist-text-wrapper"))el=root.parent();if(el.width()<=560){el.addClass("is-fv-narrow")}else{el.removeClass("is-fv-narrow")}if(width<=320){root.addClass("no-volume fp-mute")}else{if(!had_no_volume)root.removeClass("no-volume");if(!had_fp_mute)root.removeClass("fp-mute")}}check_size();jQuery(window).on("resize",check_size);api.on("ready fullscreen fullscreen-exit sticky sticky-exit",function(e){setTimeout(function(){buttons_count=root.find(".fp-controls > strong:visible").length+root.find(".fp-controls > .fp-icon:visible").length;check_size()},0)});api.on("unload pause finish error",function(){if(typeof checker!=="undefined")clearInterval(checker)})});jQuery(window).on("resize tabsactivate",function(){jQuery(".fp-playlist-external").each(function(){var playlist=jQuery(this);if(playlist.parent().width()>=900)playlist.addClass("is-wide");else playlist.removeClass("is-wide")})}).trigger("resize");flowplayer(function(api,root){api.bind("ready",function(){if(/Chrome/.test(navigator.userAgent)&&parseFloat(/Chrome\/(\d\d)/.exec(navigator.userAgent)[1],10)>54){if(api.video.subtitles){jQuery(root).addClass("chrome55fix-subtitles")}else{jQuery(root).addClass("chrome55fix")}}});root=jQuery(root);var image_src=root.css("background-image");if(image_src){image_src=image_src.replace(/url\((['"])?(.*?)\1\)/gi,"$2").split(",");if(!image_src||!image_src[0].match(/^(https?:)?\/\//))return;var image=new Image;image.src=image_src[0];var image_ratio=image.height/image.width;var player_ratio=root.height()/root.width();var ratio_diff=Math.abs(player_ratio-image_ratio);if(ratio_diff<.05){root.css("background-size","cover")}}});(function($){$(window).on("resize",function(){var iframe=$("iframe[id][src][height][width]");iframe.each(function(){if($(this).attr("id").match(/(fv_vimeo_)|(fv_ytplayer_)/)&&$(this).width()<=$(this).attr("width"))$(this).height($(this).width()*$(this).attr("height")/$(this).attr("width"))});var wistia=jQuery(".wistia_embed");wistia.each(function(){$(this).height($(this).width()*$(this).data("ratio"))})}).trigger("resize")})(jQuery);jQuery(document).on("tabsactivate",".fv_flowplayer_tabs_content",function(event,ui){var oldPlayer=jQuery(ui.oldPanel).find(".flowplayer").data("flowplayer");if(typeof oldPlayer!="undefined"){oldPlayer.pause()}var objPlayer=jQuery(".flowplayer",ui.newPanel);var api=objPlayer.data("flowplayer");api.load()});flowplayer(function(api,root){root=jQuery(root);var bean=flowplayer.bean;if(root.hasClass("is-audio")){bean.off(root[0],"mouseenter");bean.off(root[0],"mouseleave");root.removeClass("is-mouseout");root.addClass("fixed-controls").addClass("is-mouseover");api.on("error",function(e,api,error){jQuery(".fp-message",root).html(jQuery(".fp-message",root).html().replace(/video/,"audio"))});root.on("click",function(e){if(!api.ready){e.preventDefault();e.stopPropagation();api.load()}})}});flowplayer(function(api,root){if(!api.conf.fv_chromecast)return;if(!window["__onGCastApiAvailable"]){jQuery.getScript({url:"https://www.gstatic.com/cv/js/sender/v1/cast_sender.js",cache:true});window["__onGCastApiAvailable"]=function(loaded){if(!loaded)return;initialize()}}var conf=api.conf.chromecast||{},session,timer,trigger,bean=flowplayer.bean,common=flowplayer.common,waiting_for_seek=false;function initialize(){var applicationId,sessionRequest,apiConfig;applicationId=conf.applicationId||chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID;sessionRequest=new chrome.cast.SessionRequest(applicationId);apiConfig=new chrome.cast.ApiConfig(sessionRequest,sessionListener,receiverListener);chrome.cast.initialize(apiConfig,onInitSuccess,onError)}function sessionListener(){}function receiverListener(ev){console.log("FV Player: Chromecast listener",ev);if(ev!==chrome.cast.ReceiverAvailability.AVAILABLE)return;flowplayer.conf.chromecast_available=true}function onInitSuccess(){}function onError(){console.log("chromecast onError")}function createUIElements(){var btnContainer=common.find(".fp-header",root)[0];if(!btnContainer)return;common.find(".fp-chromecast",btnContainer).forEach(common.removeNode);common.find(".fp-chromecast-engine",root).forEach(common.removeNode);trigger=common.createElement("a",{class:"fp-chromecast fp-icon",title:"Play on Cast device"});btnContainer.appendChild(trigger);var chromeCastEngine=common.createElement("div",{class:"fp-chromecast-engine"}),chromeCastStatus=common.createElement("p",{class:"fp-chromecast-engine-status"}),chromeCastIcon=common.createElement("p",{class:"fp-chromecast-engine-icon"});chromeCastEngine.appendChild(chromeCastIcon);chromeCastEngine.appendChild(chromeCastStatus);var engine=common.find(".fp-engine",root)[0];if(!engine)common.prepend(common.find(".fp-player",root)[0]||root,chromeCastEngine);else engine.parentNode.insertBefore(chromeCastEngine,engine)}function destroy(){clearInterval(timer);timer=null;api.release();common.toggleClass(root,"is-chromecast",false);common.toggleClass(trigger,"fp-active",false)}function get_media(){var media=false;var sources=api.video.sources_fvqs||api.video.sources;for(var i in sources){var type=sources[i].type;if(type=="video/mp4"||type=="video/fv-mp4"||type=="application/dash+xml"){media=sources[i];break}}if(!media){for(var i in sources){if(sources[i].type=="application/x-mpegurl"){media=sources[i];break}}}if(api.video.fvhkey&&!api.conf.hls_cast)return false;if(media){var top_quality=false,mp4_qualities=["fullhd","hd","md","sd"];for(var quality in mp4_qualities){var re=new RegExp("-"+mp4_qualities[quality]);for(var i in api.video.sources_fvqs){var source=api.video.sources_fvqs[i];if(source.src.match(re)&&source.type=="video/mp4"){top_quality=source;break}}if(top_quality){media=top_quality;break}}}return media}function load_media(){var media=get_media();if(!media){return false}var cast_subtitles=[];if(api.video.subtitles){api.video.subtitles.forEach(function(v,k){if(v.src.match(/\.srt/)){console.log("FV Player: Chromecast doesn't support SRT subtitles")}var subtitles=new chrome.cast.media.Track(k,chrome.cast.media.TrackType.TEXT);subtitles.trackContentId=v.src;subtitles.trackContentType="text/vtt";subtitles.subtype=chrome.cast.media.TextTrackType.SUBTITLES;subtitles.name=v.label;subtitles.language=v.srclang+"-"+k,subtitles.customData=null;cast_subtitles.push(subtitles)})}var mediaInfo=new chrome.cast.media.MediaInfo(media.src,media.type);mediaInfo.tracks=cast_subtitles;var request=new chrome.cast.media.LoadRequest(mediaInfo);if(!api.live){request.currentTime=api.video.time}clearInterval(timer);timer=false;session.loadMedia(request,onMediaDiscovered,function onMediaError(e){console.log("onMediaError",e)})}function onMediaDiscovered(chromecast){switch_tracks(chromecast);chromecast.addUpdateListener(function(alive){if(!session)return;timer=timer||setInterval(function(){api.trigger("progress",[api,chromecast.getEstimatedTime()]);chromecast.activeTrackIds.forEach(function(track_id){jQuery.each(chromecast.media.tracks,function(k,v){if(v.trackId==track_id&&v.type=="AUDIO"){var found=hilight_audio_track("data-audio",v.language);if(!found){hilight_audio_track("data-lang",v.language)}return false}})})},500);if(alive){common.toggleClass(root,"is-chromecast",true);common.toggleClass(trigger,"fp-active",true);api.hijack({pause:function(){console.log("hijacked pause!");chromecast.pause()},resume:function(){if(api.finished){clearInterval(timer);timer=null;api.release();load_media();return}chromecast.play()},seek:function(time){var req=new chrome.cast.media.SeekRequest;req.currentTime=time;chromecast.seek(req)}})}var playerState=chromecast.playerState;if(api.paused&&playerState===chrome.cast.media.PlayerState.PLAYING)api.trigger("resume",[api]);if(api.playing&&playerState===chrome.cast.media.PlayerState.PAUSED)api.trigger("pause",[api]);if(api.seeking&&playerState===chrome.cast.media.PlayerState.BUFFERING){waiting_for_seek=true}if(api.seeking&&playerState===chrome.cast.media.PlayerState.PLAYING&&waiting_for_seek){waiting_for_seek=false;api.trigger("seek",[api])}if(playerState==chrome.cast.media.PlayerState.IDLE&&chromecast.idleReason==chrome.cast.media.IdleReason.FINISHED){api.trigger("finish",[api])}common.toggleClass(root,"is-loading",playerState===chrome.cast.media.PlayerState.BUFFERING)})}api.bind("ready",function(e,api,video){if(session){if(get_media()){api.one("progress",function(e,api){api.release();api.pause();api.mute(false,true);load_media()});api.mute(true,true)}else{session.stop();session=null;destroy();jQuery(trigger).hide()}return}if(!flowplayer.conf.chromecast_available)return;if(get_media()){createUIElements();jQuery(trigger).show()}else{FV_Flowplayer_Pro.log("FV Player: Can't find media source suitable for Chromecast!");jQuery(trigger).hide()}});bean.on(root,"click",".fp-chromecast",function(ev){ev.preventDefault();if(session){api.trigger("pause",[api]);if(session.media[0].media){var seek=session.media[0].getEstimatedTime();setTimeout(function(){api.seek(seek)},0)}session.stop();session=null;destroy();return}if(api.playing)api.pause();chrome.cast.requestSession(function(s){jQuery(root).addClass("is-loading");session=s;var receiverName=session.receiver.friendlyName;common.html(common.find(".fp-chromecast-engine-status",root)[0],"Playing on device "+receiverName);load_media()},function(err){console.error("requestSession error",err)})});bean.on(root,"click",".fv-fp-hls-menu [data-audio], .fp-subtitle-menu [data-subtitle-index]",function(){if(session&&session.media[0].media){switch_tracks(session.media[0]);return false}});jQuery(window).on("unload",function(){if(session){session.stop()}});function hilight_audio_track(attr,chromecast_language){var audio_tracks_menu=jQuery(root).find(".fv-fp-hls-menu a"),found=false;audio_tracks_menu.each(function(k,el){if(jQuery(el).attr(attr)===chromecast_language){jQuery(el).addClass("fp-selected");found=true}else{jQuery(el).removeClass("fp-selected")}});return found}function switch_tracks(chromecast){console.log(chromecast.media.tracks);var audio=jQuery(root).find(".fv-fp-hls-menu [data-audio].fp-selected").data("audio"),audio_lang=jQuery(root).find(".fv-fp-hls-menu [data-audio].fp-selected").data("lang"),subtitle_index=jQuery(root).find(".fp-subtitle-menu [data-subtitle-index].fp-selected").data("subtitle-index"),subtitles=subtitle_index>-1?api.video.subtitles[subtitle_index].srclang:false;var audio_found=false,subtitles_found=false,tracks_selected=[];jQuery.each(chromecast.media.tracks,function(k,v){if(v.language==audio&&v.type=="AUDIO"){audio_found=v}if(v.language==subtitles+"-"+subtitle_index&&v.type=="TEXT"){subtitles_found=v}});if(!audio_found){jQuery.each(chromecast.media.tracks,function(k,v){if(v.language==audio_lang&&v.type=="AUDIO"){audio_found=v;return false}})}var debug_log="";if(audio_found){tracks_selected.push(audio_found.trackId);debug_log+=audio_found.language+" audio"}if(subtitles_found){tracks_selected.push(subtitles_found.trackId);if(debug_log)debug_log+=" ";debug_log+=subtitles_found.language+" subtitles"}if(tracks_selected){var request=new chrome.cast.media.EditTracksInfoRequest(tracks_selected);chromecast.editTracksInfo(request,function(){console.log("FV Player: Chromecast "+debug_log+" loaded")},function(){console.log("FV Player: Chromecast "+debug_log+" failed")})}}});jQuery(document).on("mfpClose",function(){if(typeof jQuery(".flowplayer").data("flowplayer")!="undefined")jQuery(".flowplayer").data("flowplayer").unload()});jQuery(document).on("click",".vc_tta-tab a",function(){var api=jQuery(".flowplayer.is-playing").data("flowplayer");if(api)api.pause()});flowplayer(function(api,root){root=jQuery(root);api.bind("ready",function(){setTimeout(function(){var video=jQuery("video",root);if(video.length>0){video.prop("autoplay",false)}},100);root.find("video.fp-engine").addClass("intrinsic-ignore")})});jQuery(".flowplayer").on("ready",function(e,api){if(/BB10/.test(navigator.userAgent)){api.fullscreen()}});var fv_flowplayer_safety_resize_arr=Array();function fv_flowplayer_safety_resize(){var fv_flowplayer_safety_resize_init=false;jQuery(".flowplayer").each(function(){if(!jQuery(this).is(":visible")||jQuery(this).hasClass("lightboxed")||jQuery(this).hasClass("lightbox-starter")||jQuery(this).hasClass("is-audio"))return;if(jQuery(this).width()<30||jQuery(this).height()<20){fv_flowplayer_safety_resize_init=true;var el=jQuery(this);while(jQuery(el).width()<30||jQuery(el).width()==jQuery(this).width()){if(jQuery(el).parent().length==0)break;el=jQuery(el).parent()}jQuery(this).width(jQuery(el).width());jQuery(this).height(parseInt(jQuery(this).width()*jQuery(this).attr("data-ratio")));fv_flowplayer_safety_resize_arr[jQuery(this).attr("id")]=el}});if(fv_flowplayer_safety_resize_init){jQuery(window).resize(function(){jQuery(".flowplayer").each(function(){if(jQuery(this).hasClass("lightboxed")||jQuery(this).hasClass("lightbox-starter"))return;if(fv_flowplayer_safety_resize_arr[jQuery(this).attr("id")]){jQuery(this).width(fv_flowplayer_safety_resize_arr[jQuery(this).attr("id")].width());jQuery(this).height(parseInt(jQuery(this).width()*jQuery(this).attr("data-ratio")))}})})}}if(typeof flowplayer.conf.safety_resize!="undefined"&&flowplayer.conf.safety_resize){jQuery(document).ready(function(){setTimeout(function(){fv_flowplayer_safety_resize()},10)})}var isIE11=!!navigator.userAgent.match(/Trident.*rv[ :]*11\./);if(isIE11){jQuery(document).ready(function(){jQuery(".fp-waiting").hide()});flowplayer(function(api,root){api.bind("load",function(e){jQuery(e.currentTarget).find(".fp-waiting").show()}).bind("beforeseek",function(e){jQuery(e.currentTarget).find(".fp-waiting").show()}).bind("progress",function(e){jQuery(e.currentTarget).find(".fp-waiting").hide()}).bind("seek",function(e){jQuery(e.currentTarget).find(".fp-waiting").hide()}).bind("fullscreen",function(e){jQuery("#wpadminbar").hide()}).bind("fullscreen-exit",function(e){jQuery("#wpadminbar").show()})})}if(flowplayer.support.browser&&flowplayer.support.browser.msie&&parseInt(flowplayer.support.browser.version,10)<9){jQuery(".flowplayer").each(function(){jQuery(this).css("width",jQuery(this).css("max-width"));jQuery(this).css("height",jQuery(this).css("max-height"))})}if(location.href.match(/elementor-preview=/)){console.log("FV Player: Elementor editor is active");setInterval(fv_player_load,1e3)}else if(location.href.match(/brizy-edit-iframe/)){console.log("FV Player: Brizy editor is active");setInterval(fv_player_load,1e3)}if(window.DELEGATE_NAMES){flowplayer(function(api,root){fv_player_notice(root,fv_flowplayer_translations.chrome_extension_disable_html5_autoplay)})}flowplayer(function(api,root){flowplayer.bean.off(root,"contextmenu")});if(location.href.match(/elementor-preview=/)){console.log("FV Player: Elementor editor is active");setInterval(fv_player_load,1e3)}flowplayer(function(player,root){root=jQuery(root);if(typeof root.data("fv-embed")=="undefined"||!root.data("fv-embed")||root.data("fv-embed")=="false")return;player.embedCode=function(){var video=player.video;var width=root.width();var height=root.height();height+=2;if(root.hasClass("has-chapters")||root.hasClass("has-transcript")){height+=300}if(jQuery(".fp-playlist-external[rel="+root.attr("id")+"]").length>0){height+=150+20}var link=root.data("fv-embed")+"#"+fv_player_get_video_link_hash(player);return'<iframe src="'+link+'" allowfullscreen width="'+width+'" height="'+height+'" frameborder="0" style="max-width:100%"></iframe>'}});jQuery(document).on("click",".flowplayer .embed-code-toggle",function(){var root=jQuery(this).closest(".flowplayer");if(typeof fv_player_editor_conf!="undefined"){fv_player_notice(root,fv_player_editor_translations.embed_notice,2e3);return false}var button=jQuery(this);var player=button.parents(".flowplayer");var api=player.data("flowplayer");if(typeof api.embedCode=="function"){player.find(".embed-code textarea").val(api.embedCode())}fv_player_clipboard(player.find(".embed-code textarea").val(),function(){fv_player_notice(player,fv_flowplayer_translations.embed_copied,2e3)},function(){button.parents(".fvp-share-bar").find(".embed-code").toggle();button.parents(".fvp-share-bar").toggleClass("visible")});return false});flowplayer(function(player,root){if(jQuery(root).data("fullscreen")==false){return}player.one("ready",function(e,api,video){if(jQuery(root).find(".fp-fullscreen").length==0){jQuery(root).find(".fp-header").append('<a class="fp-fullscreen fp-icon"></a>')}});var FS_ENTER="fullscreen",FS_EXIT="fullscreen-exit",FS_SUPPORT=flowplayer.support.fullscreen,win=window,scrollX,scrollY,bean=flowplayer.bean;player.fullscreen=function(flag){if(player.disabled)return;var video=common.find("video.fp-engine",root)[0];if(flowplayer.conf.native_fullscreen&&video&&flowplayer.support.iOS){player.trigger(FS_ENTER,[player]);bean.on(document,"webkitfullscreenchange.nativefullscreen",function(){if(document.webkitFullscreenElement!==video)return;bean.off(document,".nativefullscreen");bean.on(document,"webkitfullscreenchange.nativefullscreen",function(){if(document.webkitFullscreenElement)return;bean.off(document,".nativefullscreen");player.trigger(FS_EXIT,[player])})});video.webkitEnterFullScreen();bean.one(video,"webkitendfullscreen",function(){bean.off(document,"fullscreenchange.nativefullscreen");player.trigger(FS_EXIT,[player]);common.prop(video,"controls",true);common.prop(video,"controls",false)});return}var wrapper=jQuery(root).find(".fp-player")[0];if(flag===undefined)flag=!player.isFullscreen;if(flag){scrollY=win.scrollY;scrollX=win.scrollX}if(FS_SUPPORT){if(flag){["requestFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen"].forEach(function(fName){if(typeof wrapper[fName]==="function"){wrapper[fName]({navigationUI:"hide"});if(fName==="webkitRequestFullScreen"&&!document.webkitFullscreenElement){wrapper[fName]()}}})}else{["exitFullscreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen"].forEach(function(fName){if(typeof document[fName]==="function"){document[fName]()}})}}else{player.trigger(flag?FS_ENTER:FS_EXIT,[player])}return player};var lastClick,common=flowplayer.common;player.on("mousedown.fs",function(){if(+new Date-lastClick<150&&player.ready)player.fullscreen();lastClick=+new Date});player.on(FS_ENTER,function(){common.addClass(root,"is-fullscreen");common.toggleClass(root,"fp-minimal-fullscreen",common.hasClass(root,"fp-minimal"));common.removeClass(root,"fp-minimal");if(!FS_SUPPORT)common.css(root,"position","fixed");player.isFullscreen=true}).on(FS_EXIT,function(){var oldOpacity;common.toggleClass(root,"fp-minimal",common.hasClass(root,"fp-minimal-fullscreen"));common.removeClass(root,"fp-minimal-fullscreen");if(!FS_SUPPORT&&player.engine==="html5"){oldOpacity=root.css("opacity")||"";common.css(root,"opacity",0)}if(!FS_SUPPORT)common.css(root,"position","");common.removeClass(root,"is-fullscreen");if(!FS_SUPPORT&&player.engine==="html5")setTimeout(function(){root.css("opacity",oldOpacity)});player.isFullscreen=false;if(player.engine.engineName!="fvyoutube"){win.scrollTo(scrollX,scrollY)}}).on("unload",function(){if(player.isFullscreen)player.fullscreen()});player.on("shutdown",function(){FULL_PLAYER=null;common.removeNode(wrapper)})});flowplayer(function(api,root){root=jQuery(root);if(flowplayer.conf.wpadmin||jQuery(root).hasClass("is-audio"))return;var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]"),playlist_with_fullscreen=playlist.hasClass("fp-playlist-season")||playlist.hasClass("fp-playlist-polaroid");fsforce=root.data("fsforce")==true;if(root.data("fullscreen")==false){return}if(flowplayer.conf.mobile_force_fullscreen&&flowplayer.support.fvmobile||!flowplayer.support.fullscreen&&fsforce||playlist_with_fullscreen){if(!flowplayer.support.fullscreen){api.bind("ready",function(){if(api.video.vr)return;api.fullscreen(true)})}root.on("click",function(){if(!api.ready||api.paused)api.fullscreen(true)});jQuery("[rel="+root.attr("id")+"] a").on("click",function(e){if(!api.isFullscreen){api.fullscreen();api.resume()}});api.on("resume",function(){if(api.video.vr)return;if(!api.isFullscreen)api.fullscreen()});api.on("finish",function(){if(api.conf.playlist.length==0||api.conf.playlist.length-1==api.video.index)api.fullscreen(false)}).on("fullscreen",function(a,api){root.addClass("forced-fullscreen")}).on("fullscreen-exit",function(a,api){api.pause();root.removeClass("forced-fullscreen")})}else if(fsforce){var position,unload=root.find(".fp-unload"),is_closing=false;api.isFakeFullscreen=false;unload.show();root.on("click",function(e){if(!api.ready&&e.target!=unload[0])api.fakeFullscreen(true)});unload.on("click",function(e){if(api.ready){api.fullscreen(false)}else if(api.loading){is_closing=true;api.one("resume",function(e){is_closing=false;api.pause()})}api.fakeFullscreen(false);return false});jQuery("[rel="+root.attr("id")+"] a").on("click",function(e){if(!api.isFakeFullscreen){api.fakeFullscreen();api.resume()}});api.on("resume",function(){if(!is_closing&&!api.isFakeFullscreen)api.fakeFullscreen()}).on("finish",function(){if(api.conf.playlist.length==0||api.conf.playlist.length-1==api.video.index)api.fakeFullscreen(false)}).on("fullscreen",function(a,api){root.removeClass("fake-fullscreen")}).on("fullscreen-exit",function(a,api){if(api.isFakeFullscreen)api.fakeFullscreen(true,true)}).on("unload",function(a,api){});api.fakeFullscreen=function(flag,force){if(!force&&(api.isFakeFullscreen==flag||api.disabled))return;if(position===undefined)position=root.css("position");if(flag===undefined)flag=!api.isFakeFullscreen;api.isFakeFullscreen=flag;api.trigger(flag?"fakefullscreen":"fakefullscreen-exit",[api]);root.toggleClass("is-fullscreen fake-fullscreen forced-fullscreen",flag);if(flag){root.css("position","fixed")}else{root.css("position",position)}}}if(flowplayer.support.android&&flowplayer.conf.mobile_landscape_fullscreen&&window.screen&&window.screen.orientation){api.on("fullscreen",function(a,api){if(typeof api.video.width!="undefined"&&typeof api.video.height!="undefined"&&(api.video.width!=0&&api.video.height!=0&&api.video.width<api.video.height)){screen.orientation.lock("portrait-primary")}else{screen.orientation.lock("landscape-primary")}})}});flowplayer(function(api,root){root=jQuery(root);var hlsjs,player,audioUXGroup,audioGroups,hls_audio_button,hls_audio_menu,mse=window.MediaSource||window.WebKitMediaSource;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls});api.bind("ready",function(e,api){removeAudioMenu();if(hlsjs&&api.video.type=="application/x-mpegurl"){parseAudioTracksHlsJs(hlsjs);createAudioMenu()}});api.one("progress",function(){if(api.engine.engineName=="html5"&&api.video.type=="application/x-mpegurl"){parseAudioTracksSafari();createAudioMenu()}});function getVideoTagAudioTracks(){var video=root.find("video");if(video.length&&video[0].audioTracks){return video[0].audioTracks}return[]}function hilightAudioTrack(audioTrack){if(!audioTrack.name)audioTrack.name=audioTrack.label;root.find(".fv-fp-hls-menu a").each(function(k,el){jQuery(el).toggleClass("fp-selected",jQuery(el).attr("data-audio")===audioTrack.name)})}function createAudioMenu(){if(!audioUXGroup||audioUXGroup.length<2){return}hls_audio_button=jQuery('<strong class="fv-fp-hls">'+fv_flowplayer_translations.audio_button+"</strong>");hls_audio_menu=jQuery('<div class="fp-menu fv-fp-hls-menu"></div>').insertAfter(root.find(".fp-controls"));hls_audio_menu.append("<strong>"+fv_flowplayer_translations.audio_menu+"</strong>");audioUXGroup.forEach(function(audioTrack){hls_audio_menu.append('<a data-audio="'+audioTrack.name+'" data-lang="'+audioTrack.lang+'">'+audioTrack.name+"</a>")});hls_audio_button.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();if(hls_audio_menu.hasClass("fp-active")){api.hideMenu(hls_audio_menu[0])}else{root.click();api.showMenu(hls_audio_menu[0])}});jQuery("a",hls_audio_menu).on("click",function(e){var adata=e.target.getAttribute("data-audio");if(hlsjs){var gid=hlsjs.audioTracks[hlsjs.audioTrack].groupId;var atrack=hlsjs.audioTracks.filter(function(at){return at.groupId===gid&&(at.name===adata||at.lang===adata)})[0];hlsjs.audioTrack=atrack.id;hilightAudioTrack(atrack)}else{var tracks=getVideoTagAudioTracks();for(var i in tracks){if(!tracks.hasOwnProperty(i))continue;if(tracks[i].label==adata){tracks[i].enabled=true;hilightAudioTrack(tracks[i])}}}});if(hlsjs){hilightAudioTrack(hlsjs.audioTracks[hlsjs.audioTrack])}else{var tracks=getVideoTagAudioTracks();for(var i in tracks){if(!tracks.hasOwnProperty(i))continue;if(tracks[i].enabled){hilightAudioTrack(tracks[i])}}}}function removeAudioMenu(){jQuery(hls_audio_menu).remove();jQuery(hls_audio_button).remove()}function parseAudioTracksHlsJs(data){audioGroups=[];audioUXGroup=[];data.levels.forEach(function(level){var agroup=level.attrs.AUDIO;if(agroup&&audioGroups.indexOf(agroup)<0){audioGroups.push(agroup)}if(audioGroups.length){audioUXGroup=data.audioTracks.filter(function(audioTrack){return audioTrack.groupId===audioGroups[0]})}})}function parseAudioTracksSafari(){audioGroups=[];audioUXGroup=[];var tracks=getVideoTagAudioTracks();for(var i in tracks){if(!tracks.hasOwnProperty(i))continue;audioUXGroup.push({id:tracks[i].id,name:tracks[i].label})}}});flowplayer(function(api,root){var store_engine_pos=-1;var store_engine=false;api.on("error",function(e,api,err){if(err.code!=4||api.engine.engineName!="hlsjs")return;console.log("FV Player: HLSJS failed to play the video, switching to Flash HLS");api.error=api.loading=false;jQuery(root).removeClass("is-error");jQuery(flowplayer.engines).each(function(k,v){if(flowplayer.engines[k].engineName=="hlsjs"){store_engine_pos=k;store_engine=flowplayer.engines[k];delete flowplayer.engines[k]}});var index=typeof api.video.index!="undefined"?api.video.index:0;var video=index>0?api.conf.playlist[index].sources:api.conf.clip.sources;video.index=index;api.load({sources:video});api.bind("unload error",function(){flowplayer.engines[store_engine_pos]=store_engine})})});flowplayer(function(api,root){var initialDelay=30,continueDelay=10,useDelay=initialDelay,retryLabel=fv_flowplayer_translations.live_stream_retry,timer;api.clearLiveStreamCountdown=function(){if(timer){clearInterval(timer);api.error=api.loading=false;jQuery(root).removeClass("is-error");jQuery(root).find(".fp-message.fp-shown").remove();api.unload()}};api.conf.flashls={manifestloadmaxretry:2};api.on("ready",function(){useDelay=initialDelay;retryLabel=fv_flowplayer_translations.live_stream_retry}).on("progress",function(){useDelay=continueDelay;retryLabel=fv_flowplayer_translations.live_stream_continue;clearInterval(timer)});api.on("error",function(e,api,err){setTimeout(function(){if(!api.conf.clip.live&&!api.conf.live&&!(err.video&&err.video.src.match(/\/\/vimeo.com\/event\//)))return;var delay=useDelay;if(api.conf.clip.streaming_time){delay=api.conf.clip.streaming_time-Math.floor(Date.now()/1e3)}else if(api.conf.clip.live_starts_in){delay=api.conf.clip.live_starts_in}var startLabel=fv_flowplayer_translations.live_stream_starting.replace(/%d/,secondsToDhms(delay));retryLabel=retryLabel.replace(/%d/,secondsToDhms(delay));var message=api.conf.clip.live_starts_in?startLabel:retryLabel;clearInterval(timer);if(err.code===1||err.code===2||err.code===4){root.className+=" is-offline";if(flowplayer.support.flashVideo){api.one("flashdisabled",function(){root.querySelector(".fp-flash-disabled").style.display="none"})}var messageElement=root.querySelector(".fp-ui .fp-message");messageElement.innerHTML=message;var reload_delay=delay>300?300:delay;timer=setInterval(function(){reload_delay-=1;delay-=1;if(reload_delay>0&&messageElement){messageElement.querySelector("span").innerHTML=secondsToDhms(delay)}else{clearInterval(timer);if(!api.error){return}api.error=api.loading=false;messageElement=root.querySelector(".fp-ui .fp-message");if(messageElement){root.querySelector(".fp-ui").removeChild(messageElement)}root.className=root.className.replace(/\bis-(error|offline)\b/g,"");api.load()}},1e3)}},1)});function secondsToDhms(seconds){seconds=Number(seconds);var d=Math.floor(seconds/(3600*24));var h=Math.floor(seconds%(3600*24)/3600);var m=Math.floor(seconds%3600/60);var s=Math.floor(seconds%60);var t=fv_flowplayer_translations;var output=d>0?d==1?t.duration_1_day.replace(/%s/,d):t.duration_n_days.replace(/%s/,d):"";if(output&&h>0)output+=", ";output+=h>0?h==1?t.duration_1_hour.replace(/%s/,h):t.duration_n_hours.replace(/%s/,h):"";if(output&&m>0)output+=", ";output+=m>0?m==1?t.duration_1_minute.replace(/%s/,m):t.duration_n_minutes.replace(/%s/,m):"";if(output&&s>0)output+=t.and;output+=s>0?s==1?t.duration_1_second.replace(/%s/,s):t.duration_n_seconds.replace(/%s/,s):"";return output}});flowplayer(function(api,root){root=jQuery(root);var hlsjs;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls});api.on("ready",function(e,api){if(hlsjs&&api.conf.playlist.length&&api.engine.engineName!="hlsjs-lite"){hlsjs.destroy()}})});flowplayer(function(api,root){if(!flowplayer.support.browser.safari&&!flowplayer.support.iOS)return;root=jQuery(root);var video_tag=false,did_start_playing=false,are_waiting_already=0;api.on("ready",function(e,api,video){are_waiting_already=0;did_start_playing=false;if(api.engine.engineName=="html5"&&video.src.match(/\?/)){video_tag=root.find("video");if(!video_tag.data("fv-ios-recovery")){video_tag.on("waiting",wait_for_stalled);video_tag.data("fv-ios-recovery",true)}api.one("progress",function(){did_start_playing=true})}});api.bind("beforeseek",wait_for_stalled);function debug(e){console.log("FV Player: iOS video element: "+e.type)}function wait_for_stalled(){if(!did_start_playing){return}if(video_tag&&api.engine.engineName=="html5"){are_waiting_already++;if(are_waiting_already>1){if(are_waiting_already>3){console.log("FV Player: iOS video element needs a push, triggering 'stalled'");video_tag.trigger("stalled")}return}console.log("FV Player: iOS video element will trigger error after 'stalled' arrives");video_tag.one("stalled",function(){var time=api.video.time;if(api.video.type.match(/video\//)){console.log("FV Player: Running check of video file...");var test_video=document.createElement("video");test_video.src=api.video.src;test_video.onloadedmetadata=function(){are_waiting_already=0;console.log("FV Player: Video link works")};test_video.onerror=function(){console.log("FV Player: Video link issue!");if(are_waiting_already>0){api.trigger("error",[api,{code:4,video:api.video}])}};return}setTimeout(function(){console.log(api.video.time,time);if(api.video.time!=time){console.log("FV Player: iOS video element continues playing, no need for error");return}if(api.paused){console.log("FV Player: iOS video element paused, no need for error");return}api.trigger("error",[api,{code:4,video:api.video}])},5e3)})}}});!function(e){var n=!1;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var o=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=o,t}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}function n(o){function t(n,r,i){var c;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(i=e({path:"/"},t.defaults,i)).expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{c=JSON.stringify(r),/^[\{\[]/.test(c)&&(r=c)}catch(e){}r=o.write?o.write(r,n):encodeURIComponent(r+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=(n=(n=encodeURIComponent(n+"")).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var s="";for(var f in i)i[f]&&(s+="; "+f,!0!==i[f]&&(s+="="+i[f]));return document.cookie=n+"="+r+s}n||(c={});for(var p=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,u=0;u<p.length;u++){var l=p[u].split("="),C=l.slice(1).join("=");this.json||'"'!==C.charAt(0)||(C=C.slice(1,-1));try{var m=l[0].replace(d,decodeURIComponent);if(C=o.read?o.read(C,m):o(C,m)||C.replace(d,decodeURIComponent),this.json)try{C=JSON.parse(C)}catch(e){}if(n===m){c=C;break}n||(c[m]=C)}catch(e){}}return c}}return t.set=t,t.get=function(e){return t.call(t,e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(n,o){t(n,"",e(o,{expires:-1}))},t.withConverter=n,t}return n(function(){})});flowplayer.bean.off(document,"keydown.fp");flowplayer(function(api,root){var bean=flowplayer.bean;if(!api.conf.keyboard)return;bean.on(root,"mouseenter mouseleave",function(e){fv_player_focused=!api.disabled&&e.type=="mouseover"?api:0;if(fv_player_focused)fv_player_focusedRoot=root});api.bind("ready",function(e,api,video){if(video.subtitles&&video.subtitles.length>0){var help=jQuery(root).find(".fp-help").html();help+='<div class="fp-help-section fp-help-subtitles"><p><em>c</em>cycle through subtitles</p></div>';jQuery(root).find(".fp-help").html(help)}else{jQuery(root).find(".fp-help-subtitles").remove()}})});flowplayer.bean.on(document,"keydown.fp",function(e){if(typeof fv_player_focused=="undefined")return;var api=fv_player_focused,focusedRoot=api?fv_player_focusedRoot:false,common=flowplayer.common;var el=api&&!api.disabled?api:0,metaKeyPressed=e.ctrlKey||e.metaKey||e.altKey,key=e.which,conf=el&&el.conf;if(common.hasClass(focusedRoot,"no-controlbar")||common.hasClass(focusedRoot,"is-cva"))return;if(!el||!conf.keyboard||el.disabled)return;if([63,187,191].indexOf(key)!=-1){common.toggleClass(focusedRoot,"is-help");return false}if(key==27&&common.hasClass(focusedRoot,"is-help")){common.toggleClass(focusedRoot,"is-help");return false}if(!metaKeyPressed&&el.ready){e.preventDefault();if(e.shiftKey){if(key==39)el.speed(true);else if(key==37)el.speed(false);else if(key==78)el.next();else if(key==80)el.prev();return}if(key<58&&key>47)return el.seekTo(key-48);switch(key){case 38:case 75:el.volume(el.volumeLevel+.15);break;case 40:case 74:el.volume(el.volumeLevel-.15);break;case 39:case 76:el.seeking=true;el.seek(api.video.time+5);break;case 37:case 72:el.seeking=true;el.seek(api.video.time-5);break;case 190:el.seekTo();break;case 32:el.toggle();break;case 70:if(conf.fullscreen)el.fullscreen();break;case 77:el.mute();break;case 81:el.unload();break;case 67:if(!api.video.subtitles||api.video.subtitles.length==0)break;var current_subtitles=jQuery(focusedRoot).find(".fp-dropdown li.active[data-subtitle-index]").data("subtitle-index");if(typeof current_subtitles=="undefined")current_subtitles=-1;current_subtitles++;if(current_subtitles>api.video.subtitles.length-1){current_subtitles=-1}api.trigger("fv-subtitles-switched");if(current_subtitles>-1){el.loadSubtitles(current_subtitles);fv_player_notice(focusedRoot,fv_flowplayer_translations.subtitles_switched+" "+api.video.subtitles[current_subtitles].label,"fv-subtitles-switched")}else{el.disableSubtitles();fv_player_notice(focusedRoot,fv_flowplayer_translations.subtitles_disabled,"fv-subtitles-switched")}break}}});flowplayer(function(api,root){api.bind("load",function(e,api,data){var player=jQuery(e.currentTarget);if(player.data("live")){var live_check=setTimeout(function(){player.find(".fp-ui").append('<div class="fp-message">'+fv_flowplayer_translations.live_stream_failed+"</div>");player.addClass("is-error")},1e4);jQuery(e.currentTarget).data("live_check",live_check)}}).bind("ready",function(e,api,data){clearInterval(jQuery(e.currentTarget).data("live_check"))}).bind("error",function(e,api,data){var player=jQuery(e.currentTarget);if(player.data("live")){player.find(".fp-message").html(fv_flowplayer_translations.live_stream_failed_2)}})});(function($){flowplayer(function(api,root){if(jQuery(root).hasClass("is-cva"))return;$(document).on("submit","#"+jQuery(root).attr("id")+" .mailchimp-form",function(e){e.preventDefault();$(".mailchimp-response",root).remove();$("input[type=submit]",root).attr("disabled","disabled").addClass("fv-form-loading");var data={action:"fv_wp_flowplayer_email_signup"};$("[name]",this).each(function(){data[this.name]=$(this).val()});$.post(fv_player.ajaxurl,data,function(response){response=JSON.parse(response);$('<div class="mailchimp-response"></div>').insertAfter(".mailchimp-form",root);if(response.text.match(/already subscribed/)){response.status="ERROR"}if(response.status==="OK"){$(".mailchimp-form input[type=text],.mailchimp-form input[type=email]",root).val("");$(".mailchimp-response",root).removeClass("is-fv-error").html(response.text);setTimeout(function(){$(".wpfp_custom_popup",root).fadeOut()},2e3)}else{$(".mailchimp-response",root).addClass("is-fv-error").html(response.text)}$("input[type=submit]",root).removeAttr("disabled").removeClass("fv-form-loading")})})})})(jQuery);function fv_flowplayer_mobile_switch(id){var regex=new RegExp("[\\?&]fv_flowplayer_mobile=([^&#]*)");var results=regex.exec(location.search);if((results!=null&&results[1]=="yes"||(jQuery(window).width()<=480||jQuery(window).height()<=480))&&(results==null||results[1]!="no")){var fv_fp_mobile=false;jQuery("#wpfp_"+id+" video source").each(function(){if(jQuery(this).attr("id")!="wpfp_"+id+"_mobile"){fv_fp_mobile=true;jQuery(this).remove()}});if(fv_fp_mobile){jQuery("#wpfp_"+id).after('<p class="fv-flowplayer-mobile-switch">'+fv_flowplayer_translations.mobile_browser_detected_1+' <a href="'+document.URL+'?fv_flowplayer_mobile=no">'+fv_flowplayer_translations.mobile_browser_detected_2+"</a>.</p>")}}}if(typeof fv_flowplayer_mobile_switch_array!="undefined"){for(var i in fv_flowplayer_mobile_switch_array){if(!fv_flowplayer_mobile_switch_array.hasOwnProperty(i))continue;fv_flowplayer_mobile_switch(i)}}flowplayer(function(api,root){if(!flowplayer.support.touch)return;jQuery.fn.fv_single_double_click=function(single_click_callback,double_click_callback,timeout){return this.each(function(){var clicks=0,self=this;jQuery(this).on("click",function(event){clicks++;if(clicks==1){setTimeout(function(){if(clicks==1){single_click_callback.call(self,event)}else{double_click_callback.call(self,event)}clicks=0},timeout||300)}})})};root=jQuery(root);var left=jQuery('<div class="fv-fp-tap-left"><span>-10s</span></div>'),right=jQuery('<div class="fv-fp-tap-right"><span>+10s</span></div>');left.fv_single_double_click(function(){api.toggle()},function(e){maybe_seek(e,left,api.ready?api.video.time-10:false)});right.fv_single_double_click(function(){api.toggle()},function(e){maybe_seek(e,right,api.ready?api.video.time+10:false)});root.find(".fp-ui").append(left).append(right);function maybe_seek(e,el,time){if(api.ready){api.seek(time);animation(el)}else{api.toggle()}e.preventDefault()}function animation(el){el.addClass("is-active");setTimeout(function(){el.removeClass("is-active")},500)}});flowplayer(function(api,root){root=jQuery(root);var instance_id=root.data("flowplayer-instance-id");flowplayer.audible_instance=-1;api.one("load",function(){setTimeout(function(){api.conf.splash=false},0)});api.on("ready",function(){var is_muted=root.data("volume")==0;if(!is_muted){flowplayer.audible_instance=instance_id}jQuery(".flowplayer[data-flowplayer-instance-id]").each(function(){var player=jQuery(this).data("flowplayer");var current_instance_id=jQuery(this).data("flowplayer-instance-id");if(flowplayer.audible_instance==-1||current_instance_id==flowplayer.audible_instance||current_instance_id==instance_id)return;if(player){if(player.ready){if(api.conf.multiple_playback){if(!is_muted){player.mute(true,true)}}else if(player.playing){player.pause()}}else{player.clearLiveStreamCountdown();player.unload()}}})}).on("mute",function(e,api,muted){if(!muted&&flowplayer.audible_instance!=instance_id){flowplayer(flowplayer.audible_instance).mute(true,true);flowplayer.audible_instance=instance_id}}).on("resume",function(){if(!api.conf.multiple_playback){jQuery(".flowplayer[data-flowplayer-instance-id]").each(function(){if(instance_id==jQuery(this).data("flowplayer-instance-id"))return;var player=jQuery(this).data("flowplayer");if(player&&player.playing){player.pause()}})}})});function fv_flowplayer_browser_ff_m4v(hash){if(flowplayer.support.browser&&flowplayer.support.browser.mozilla&&navigator.appVersion.indexOf("Win")!=-1){jQuery("#wpfp_"+hash).attr("data-engine","flash")}}if(typeof fv_flowplayer_browser_ff_m4v_array!="undefined"){for(var i in fv_flowplayer_browser_ff_m4v_array){if(!fv_flowplayer_browser_ff_m4v_array.hasOwnProperty(i))continue;fv_flowplayer_browser_ff_m4v(i)}}function fv_flowplayer_browser_chrome_fail(hash,sAttributes,sVideo,bAutobuffer){jQuery("#wpfp_"+hash).bind("error",function(e,api,error){if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())&&error!=null&&(error.code==3||error.code==4||error.code==5)){api.unload();jQuery("#wpfp_"+hash).attr("id","bad_wpfp_"+hash);jQuery("#bad_wpfp_"+hash).after('<div id="wpfp_'+hash+'" '+sAttributes+' data-engine="flash"></div>');jQuery("#wpfp_"+hash).flowplayer({playlist:[[{mp4:sVideo}]]});if(bAutobuffer){jQuery("#wpfp_"+hash).bind("ready",function(e,api){api.play()})}else{jQuery("#wpfp_"+hash).flowplayer().play(0)}jQuery("#bad_wpfp_"+hash).remove()}})}if(typeof fv_flowplayer_browser_chrome_fail_array!="undefined"){for(var i in fv_flowplayer_browser_chrome_fail_array){if(!fv_flowplayer_browser_chrome_fail_array.hasOwnProperty(i))continue;fv_flowplayer_browser_chrome_fail(i,fv_flowplayer_browser_chrome_fail_array[i]["attrs"],fv_flowplayer_browser_chrome_fail_array[i]["mp4"],fv_flowplayer_browser_chrome_fail_array[i]["auto_buffer"])}}function fv_flowplayer_browser_ie(hash){if(flowplayer.support.browser&&flowplayer.support.browser.msie&&parseInt(flowplayer.support.browser.version,10)>=9||!!navigator.userAgent.match(/Trident.*rv[ :]*11\./)){jQuery("#wpfp_"+hash).attr("data-engine","flash")}}if(typeof fv_flowplayer_browser_ie_array!="undefined"){for(var i in fv_flowplayer_browser_ie_array){if(!fv_flowplayer_browser_ie_array.hasOwnProperty(i))continue;fv_flowplayer_browser_ie(i)}}function fv_flowplayer_browser_chrome_mp4(hash){var match=window.navigator.appVersion.match(/Chrome\/(\d+)\./);if(match!=null){var chrome_ver=parseInt(match[1],10);if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())&&chrome_ver<28&&navigator.appVersion.indexOf("Win")!=-1||/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())&&chrome_ver<27&&navigator.appVersion.indexOf("Linux")!=-1&&navigator.userAgent.toLowerCase().indexOf("android")==-1){jQuery("#wpfp_"+hash).attr("data-engine","flash")}}}if(navigator.platform.indexOf("iPhone")!=-1||navigator.platform.indexOf("iPod")!=-1||navigator.platform.indexOf("iPad")!=-1||navigator.userAgent.toLowerCase().indexOf("android")!=-1){flowplayer(function(api,root){api.bind("error",function(e,api,error){if(error.code==10){jQuery(e.target).find(".fp-message").html(fv_flowplayer_translations.unsupported_format)}})})}jQuery(document).ready(function(){if(navigator.platform.indexOf("iPhone")!=-1||navigator.platform.indexOf("iPod")!=-1||navigator.platform.indexOf("iPad")!=-1){jQuery(window).trigger("load")}jQuery(".flowplayer").on("mouseleave",function(){jQuery(this).find(".fvp-share-bar").removeClass("visible");jQuery(this).find(".embed-code").hide()})});if(typeof flowplayer!=="undefined"){flowplayer(function(api,root){root=jQuery(root);var notice=false,hlsjs;flowplayer.engine("hlsjs-lite").plugin(function(params){hlsjs=params.hls});var playlist=api.conf.playlist.length?api.conf.playlist:[api.conf.clip];if(playlist[0].pending_encoding){show_notice(playlist[0])}api.on("load",function(e,api,video){if(video.pending_encoding){show_notice(video);if(hlsjs){hlsjs.destroy()}return false}remove_notice()});function show_notice(video){remove_notice();var title="Video is being processed",message="Please return later to see the actual video in this player.";if(video.pending_encoding_error){title="Video unavailable";message="There was an error in the video encoding."}else if(video.pending_encoding_progress){message+="<br /><br />("+video.pending_encoding_progress+" done)"}notice=jQuery('<div class="fv-player-encoder-video-processing-modal"><div><h2>'+title+"</h2><p>"+message+"</p></div></div");root.append(notice)}function remove_notice(){if(notice){notice.remove()}}})}if(!Date.now){Date.now=function(){return(new Date).getTime()}}(function($){var sendPositionsEvery=60,ajaxCall=null,maxCookieSize=2500,localStorageEnabled=null,cookiePositionsKeyName="video_positions",cookiePlaylistsKeyName="player_playlist_item",tempPositionCookieKeyName="video_positions_tmp",tempPlaylistsCookieKeyName="player_playlist_item_tmp",tempSawCookieKeyName="video_saw_tmp",playPositions=[],playlistIndexes=[],sawVideo=[],getSerialized=function(data){var serialized=JSON.stringify(data),dataSize=getTextByteSize(serialized);if(dataSize>maxCookieSize){while(dataSize>maxCookieSize){for(var i in data){if(!data.hasOwnProperty(i))continue;delete data[i];serialized=JSON.stringify(data);dataSize=getTextByteSize(serialized);break}}}return serialized},getVideoId=function(video){if(video.id){return video.id}var out=typeof video.sources_original!="undefined"&&typeof video.sources_original[0]!="undefined"?video.sources_original[0].src:video.sources[0].src;if(typeof video.sources_original=="undefined"||typeof video.sources_original[0]=="undefined"){out=removeAWSSignatures(out)}return out},getTextByteSize=function(txt){return encodeURIComponent(txt).length},getCookieKey=function(key){return localStorageEnabled?localStorage.getItem(key):Cookies.get(key)},setCookieKey=function(key,value){return localStorageEnabled?localStorage.setItem(key,value):Cookies.set(key,value)},removeCookieKey=function(key){if(localStorageEnabled){localStorage.removeItem(key)}{Cookies.remove(key)}},removeVideoPosition=function(e,api){if(api.video.sources){var video_id=getVideoId(api.video);playPositions[video_id]=0;sawVideo[video_id]=1}},removeAWSSignatures=function(videoURL){return videoURL.replace(/(X-Amz-Algorithm=[^&]+&?)/gm,"").replace(/(X-Amz-Credential=[^&]+&?)/gm,"").replace(/(X-Amz-Date=[^&]+&?)/gm,"").replace(/(X-Amz-Expires=[^&]+&?)/gm,"").replace(/(X-Amz-SignedHeaders=[^&]+&?)/gm,"").replace(/(X-Amz-Signature=[^&]+&?)/gm,"")},sendVideoPositions=function(async,callback){var beaconSupported="sendBeacon"in navigator;if(async!==true){async=false}if(!callback||typeof callback=="undefined"){callback=function(){}}postDataPositions=[];postDataPlaylists=[];for(var video_name in playPositions){if(!playPositions.hasOwnProperty(video_name))continue;postDataPositions.push({name:video_name,position:playPositions[video_name],saw:typeof sawVideo[video_name]!="undefined"?sawVideo[video_name]:false})}for(var player_id in playlistIndexes){if(!playlistIndexes.hasOwnProperty(player_id))continue;postDataPlaylists.push({player:player_id,item:playlistIndexes[player_id]})}if(!postDataPlaylists.length){removeCookieKey(tempPlaylistsCookieKeyName)}if(!postDataPositions.length){removeCookieKey(tempPositionCookieKeyName);removeCookieKey(tempSawCookieKeyName);return}if(flowplayer.conf.is_logged_in=="1"){if(beaconSupported){try{var temp_position_data={},temp_saw_data={},temp_playlist_data={};for(var i in postDataPositions){if(!postDataPositions.hasOwnProperty(i))continue;temp_position_data[postDataPositions[i].name]=postDataPositions[i].position;temp_saw_data[postDataPositions[i].name]=postDataPositions[i].saw}for(var i in postDataPlaylists){if(!postDataPlaylists.hasOwnProperty(i))continue;temp_playlist_data[postDataPlaylists[i].player]=postDataPlaylists[i].item}setCookieKey(tempPositionCookieKeyName,getSerialized(temp_position_data));setCookieKey(tempSawCookieKeyName,getSerialized(temp_saw_data));setCookieKey(tempPlaylistsCookieKeyName,getSerialized(temp_playlist_data))}catch(e){return}var fd=new FormData;fd.append("action","fv_wp_flowplayer_video_position_save");fd.append("videoTimes",encodeURIComponent(JSON.stringify(postDataPositions)));fd.append("playlistItems",encodeURIComponent(JSON.stringify(postDataPlaylists)));navigator.sendBeacon(fv_player.ajaxurl,fd);return false}else{return jQuery.ajax({type:"POST",async:async,url:fv_player.ajaxurl,complete:callback,data:{action:"fv_wp_flowplayer_video_position_save",videoTimes:postDataPositions,playlistItems:postDataPlaylists}})}}else{try{var data_positions=getCookieKey(cookiePositionsKeyName);var data_playlist_item=getCookieKey(cookiePlaylistsKeyName);if(data_positions&&typeof data_positions!=="undefined"){data_positions=JSON.parse(data_positions)}else{data_positions={}}if(data_playlist_item&&typeof data_playlist_item!=="undefined"){data_playlist_item=JSON.parse(data_playlist_item)}else{data_playlist_item={}}for(var i in postDataPositions){if(!postDataPositions.hasOwnProperty(i))continue;data_positions[postDataPositions[i].name]=postDataPositions[i].position}for(var i in postDataPlaylists){if(!postDataPlaylists.hasOwnProperty(i))continue;data_playlist_item[postDataPlaylists[i].player]=postDataPlaylists[i].item}var serialized_positions=JSON.stringify(data_positions),serialized_playlist_items=JSON.stringify(data_playlist_item),dataSize_postions=getTextByteSize(serialized_positions),dataSize_playlist_items=getTextByteSize(serialized_playlist_items);if(dataSize_postions>maxCookieSize){while(dataSize_postions>maxCookieSize){for(var i in data_positions){if(!data_positions.hasOwnProperty(i))continue;delete data_positions[i];serialized_positions=JSON.stringify(data_positions);dataSize_postions=getTextByteSize(serialized_positions);break}}}if(dataSize_playlist_items>maxCookieSize){while(dataSize_playlist_items>maxCookieSize){for(var i in data_positions){if(!data_playlist_item.hasOwnProperty(i))continue;delete data_playlist_item[i];serialized_playlist_items=JSON.stringify(data_playlist_item);dataSize_playlist_items=getTextByteSize(serialized_positions);break}}}setCookieKey(cookiePositionsKeyName,serialized_positions);setCookieKey(cookiePlaylistsKeyName,serialized_playlist_items)}catch(e){return}}return false};flowplayer(function(api,root){if(typeof api.conf.disable_localstorage!="undefined"){return}var $root=jQuery(root),enabled=flowplayer.conf.video_position_save_enable&&$root.data("save-position")!="false"||$root.data("save-position"),progressEventsCount=0,player_id=$root.data("player-id")?$root.data("player-id"):false,item_changed=false,seekIntoPosition=function(e,api){if(api.video&&api.video.live)return;var video_id=getVideoId(api.video),position=api.video.position;if(flowplayer.conf.is_logged_in!="1"){var data=getCookieKey(cookiePositionsKeyName);if(data&&typeof data!=="undefined"){try{data=JSON.parse(data);if(data[video_id]){position=data[video_id]}}catch(e){return}}}if(!!api.get_custom_end&&api.get_custom_end()<position){position=false}if(!!api.get_custom_start&&api.get_custom_start()>0){if(position<api.get_custom_start()){position=false}}api.bind("progress",storeVideoPosition);if(position){seek(position)}},storeVideoPosition=function(e,api){if(api.live){return}if(api.video.sources){var video_id=getVideoId(api.video),position=Math.round(api.video.time);playPositions[video_id]=position;if(api.conf.playlist.length>0){if(player_id)playlistIndexes[player_id]=api.video.index}if(progressEventsCount++>=sendPositionsEvery&&flowplayer.conf.closingPage){if(ajaxCall){ajaxCall.abort()}ajaxCall=sendVideoPositions(true,function(){ajaxCall=null});progressEventsCount=0}}},forceSavePosition=function(e,api){var inPlaylist=false;for(var i in api.conf.playlist){if(!api.conf.playlist.hasOwnProperty(i))continue;inPlaylist=true;break}if(inPlaylist&&!flowplayer.conf.closingPage){progressEventsCount=sendPositionsEvery+1;storeVideoPosition(e,api);sendVideoPositions()}},seek=function(position){if(!!api.custom_seek){api.custom_seek(position);return}var seek_count=0;var do_seek=setInterval(function(){if(++seek_count>20)clearInterval(do_seek);if(api.loading)return;api.seek(parseInt(position));clearInterval(do_seek)},10)},processTempData=function(temp_data_name,video_id){var data=getCookieKey(temp_data_name),output=false;if(data&&typeof data!=="undefined"){try{data=JSON.parse(data);if(typeof data[video_id]!="undefined"){output=data[video_id];delete data[video_id];var stillHasData=false;for(var i in data){if(!data.hasOwnProperty(i))continue;stillHasData=true;break}if(stillHasData){setCookieKey(temp_data_name,JSON.stringify(data))}else{removeCookieKey(temp_data_name)}}return output}catch(e){}}},restorePlaylistItem=function(e,api){if(typeof api=="undefined"||api.conf.playlist.length==0)return;var item_index=-1;if(player_id){if(flowplayer.conf.is_logged_in!="1"){var data=getCookieKey(cookiePlaylistsKeyName);if(data&&typeof data!=="undefined"){try{data=JSON.parse(data);if(data[player_id]){item_index=data[player_id]}}catch(e){return}}}else if(flowplayer.conf.is_logged_in=="1"){item_index=api.conf.playlist.length>0?processTempData(tempPlaylistsCookieKeyName,player_id):false}}if(item_index>=0&&!item_changed){api.play(item_index);item_changed=true}};if(!enabled)return;if(getCookieKey(tempPlaylistsCookieKeyName)){$root.removeData("playlist_start")}api.bind("finish",removeVideoPosition);api.one("progress",seekIntoPosition);api.bind("unload",function(){item_changed=false;api.one("ready",restorePlaylistItem)});api.one("ready",restorePlaylistItem);jQuery(".fp-ui",root).on("click",function(){restorePlaylistItem()});api.playlist_thumbnail_progress=function(el,video,position){if(!!api.get_custom_start&&api.get_custom_start(video)>0){position-=api.get_custom_start(video);if(position<0)position=0}var duration=video.duration;if(!!api.get_custom_duration&&api.get_custom_duration()>0){duration=api.get_custom_duration()}if(!duration){duration=el.data("duration")}if(!duration)return;var progress=100*position/duration;el.css("width",progress+"%")};if(flowplayer.conf.is_logged_in=="1"){var playlist=api.conf.playlist.length>0?api.conf.playlist:[api.conf.clip],playlist_external=jQuery("[rel="+jQuery(root).attr("id")+"]");for(var i in playlist){if(!playlist.hasOwnProperty(i))continue;var video_id=getVideoId(playlist[i]),position=processTempData(tempPositionCookieKeyName,video_id),saw=processTempData(tempSawCookieKeyName,video_id);if(position){if(api.conf.playlist.length){api.conf.playlist[i].sources[0].position=position;var playlist_progress=jQuery("a",playlist_external).eq(i).find(".fvp-progress");if(playlist_progress.length){api.playlist_thumbnail_progress(playlist_progress,api.conf.playlist[i],position)}}else{api.conf.clip.sources[0].position=position}}if(saw){if(api.conf.playlist.length){api.conf.playlist[i].sources[0].saw=true}else{api.conf.clip.sources[0].saw=true}}}}api.bind("finish",function(e,api){if(api.conf.playlist.length){api.conf.playlist[api.video.index].sources[0].saw=true}else{api.conf.clip.sources[0].saw=true}})});jQuery(window).on("beforeunload pagehide",function(){if(!flowplayer.conf.closingPage){flowplayer.conf.closingPage=true;sendVideoPositions()}});if(typeof fv_flowplayer_conf.disable_localstorage!="undefined"){localStorageEnabled=false}if(localStorageEnabled!==null){return localStorageEnabled}localStorageEnabled=true;try{localStorage.setItem("t","t");if(localStorage.getItem("t")!=="t"){localStorageEnabled=false}localStorage.removeItem("t")}catch(e){localStorageEnabled=false}})(jQuery);flowplayer(function(api,root){root=jQuery(root);if(api.conf.playlist.length==0)return;var real_videos=0;jQuery(api.conf.playlist).each(function(k,v){if(typeof v.click=="undefined"){real_videos++}});if(real_videos<2)return;var playlist=jQuery(".fp-playlist-external[rel="+root.attr("id")+"]");var playlist_button=jQuery('<strong class="fv-fp-list">Item 1.</strong>'),playlist_button_name=jQuery('<strong class="fv-fp-list-name">Item 1.</strong>'),playlist_menu=jQuery('<div class="fp-menu fv-fp-list-menu"></div>').insertAfter(root.find(".fp-controls"));var i=0,item_index=[],track_item=[];jQuery(api.conf.playlist).each(function(k,v){if(typeof v.click=="undefined"){var title=parse_title(playlist.find("h4").eq(i));playlist_menu.append('<a data-index="'+k+'">'+(i+1)+". "+title+"</a>");track_item[k]=title;item_index.push(k);i++}});function playlist_button_click(e){e.preventDefault();e.stopPropagation();if(playlist_menu.hasClass("fp-active")){api.hideMenu(playlist_menu[0])}else{root.trigger("click");api.showMenu(playlist_menu[0])}}playlist_button.insertAfter(root.find(".fp-controls .fp-volume")).on("click",playlist_button_click);playlist_button_name.insertAfter(playlist_button).on("click",playlist_button_click);jQuery("a",playlist_menu).on("click",function(){if(typeof api.conf.playlist[jQuery(this).data("index")-1]!="undefined"&&typeof api.conf.playlist[jQuery(this).data("index")-1].click!="undefined"){api.play(jQuery(this).data("index")-1)}else{api.play(jQuery(this).data("index"))}});api.on("ready",function(e,api,video){playlist_menu.find("a").removeClass("fp-selected");var thumb=playlist_menu.find("a[data-index="+video.index+"]");thumb.addClass("fp-selected");var label=fv_flowplayer_translations.playlist_item_no;label=label.replace(/%d/,item_index.indexOf(video.index)+1);label=label.replace(/%s/,parse_title(thumb.find("h4")));playlist_button.html(label);playlist_button_name.html(item_index.indexOf(video.index)+1+". "+track_item[video.index])});function parse_title(el){var tmp=el.clone();tmp.find("i.dur").remove();return tmp.text()}});flowplayer(function(api,root){root=jQuery(root);var playlist=api.conf.playlist,videoIndex;api.bind("load",function(e,api,video){videoIndex=video.index});api.bind("error",function(e,api,error){setTimeout(function(){if(playlist.length>0&&api.error==true){videoIndex=api.video.index;if(api.conf.video_checker=="1"&&playlist[videoIndex].video_checker&&playlist[videoIndex].video_checker.length>0){console.log("FV Player: Video checker message present, stopping auto-advance to next playlist item");return false}api.error=api.loading=false;root.removeClass("is-error");root.find(".fp-message.fp-shown").remove();videoIndex++;if(videoIndex>playlist.length-1){videoIndex=0}console.log("FV Player: Playlist item failure, auto-advancing to "+(videoIndex+1)+". item");api.play(videoIndex)}},1e3)})});flowplayer(function(api,root){root=jQuery(root);var original_prev,original_next,random_seed;if(!root.data("button-no-picture")&&!root.data("button-repeat")&&!root.data("button-rewind"))return;api.bind("ready",function(e,api){if(typeof original_next=="undefined"&&typeof original_prev=="undefined"){original_next=api.next;original_prev=api.prev}if(!api.video.type.match(/^audio/)&&root.data("button-no-picture")&&root.find(".fv-fp-no-picture").length==0){var button_no_picture=jQuery('<span class="fv-fp-no-picture"><svg viewBox="0 0 90 80" width="18px" height="18px" class="fvp-icon fvp-nopicture"><use xlink:href="#fvp-nopicture"></use></svg></span>');button_no_picture.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();jQuery(".fp-engine",root).slideToggle(20);jQuery(this).toggleClass("is-active fp-color-fill")})}if(root.data("button-repeat")){if(api.conf.playlist.length>0&&root.find(".fv-fp-playlist").length==0){var t=fv_flowplayer_translations,playlist_button=jQuery('<strong class="fv-fp-playlist mode-normal"> <svg viewBox="0 0 80.333 80" width="18px" height="18px" class="fvp-icon fvp-replay-list"><title>'+t.playlist_replay_all+'</title><use xlink:href="#fvp-replay-list"></use></svg> <svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-shuffle"><title>'+t.playlist_shuffle+'</title><use xlink:href="#fvp-shuffle"></use></svg> <svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-replay-track"><title>'+t.playlist_replay_video+'</title><use xlink:href="#fvp-replay-track"></use></svg> <span id="fvp-playlist-play" title="'+t.playlist_play_all+'">'+t.playlist_play_all_button+"</span> </strong>"),playlist_menu=jQuery('<div class="fp-menu fv-fp-playlist-menu"> <a data-action="repeat_playlist"><svg viewBox="0 0 80.333 80" width="18px" height="18px" class="fvp-icon fvp-replay-list"><title>'+t.playlist_replay_all+'</title><use xlink:href="#fvp-replay-list"></use></svg> <span class="screen-reader-text">'+t.playlist_replay_all+'</span></a> <a data-action="shuffle_playlist"><svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-shuffle"><title>'+t.playlist_shuffle+'</title><use xlink:href="#fvp-shuffle"></use></svg> <span class="screen-reader-text">'+t.playlist_shuffle+'</span></a> <a data-action="repeat_track"><svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-replay-track"><title>'+t.playlist_replay_video+'</title><use xlink:href="#fvp-replay-track"></use></svg> <span class="screen-reader-text">'+t.playlist_replay_video+'</span></a> <a class="fp-selected" data-action="normal"><span id="fvp-playlist-play" title="'+t.playlist_play_all+'">'+t.playlist_play_all_button+"</span></a> </div>").insertAfter(root.find(".fp-controls"));api.conf.playlist_shuffle=api.conf.track_repeat=false;random_seed=randomize();var should_advance=api.conf.advance;playlist_button.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();if(playlist_menu.css("right")!=="auto"){playlist_menu.css({right:"auto",left:playlist_button.position().left+"px"})}if(playlist_menu.hasClass("fp-active")){api.hideMenu(playlist_menu[0])}else{root.trigger("click");api.showMenu(playlist_menu[0])}});jQuery("a",playlist_menu).on("click",function(){jQuery(this).siblings("a").removeClass("fp-selected");jQuery(this).addClass("fp-selected");playlist_button.removeClass("mode-normal mode-repeat-track mode-repeat-playlist mode-shuffle-playlist");var action=jQuery(this).data("action");if(action=="repeat_playlist"){playlist_button.addClass("mode-repeat-playlist");api.conf.loop=true;api.conf.advance=true;api.video.loop=api.conf.track_repeat=false;api.conf.playlist_shuffle=false}else if(action=="shuffle_playlist"){playlist_button.addClass("mode-shuffle-playlist");api.conf.loop=true;api.conf.advance=true;api.conf.playlist_shuffle=true}else if(action=="repeat_track"){playlist_button.addClass("mode-repeat-track");api.conf.track_repeat=api.video.loop=true;api.conf.loop=api.conf.playlist_shuffle=false}else if(action=="normal"){playlist_button.addClass("mode-normal");api.conf.track_repeat=api.video.loop=false;api.conf.loop=api.conf.playlist_shuffle=false}if(api.conf.playlist_shuffle){api.next=function(){api.play(random_seed.pop());if(random_seed.length==0)random_seed=randomize()};api.prev=function(){api.play(random_seed.shift());if(random_seed.length==0)random_seed=randomize()}}else{api.next=original_next;api.prev=original_prev}});if(api.conf.loop){jQuery("a[data-action=repeat_playlist]",playlist_menu).trigger("click")}api.on("progress",function(){api.video.loop=api.conf.track_repeat});api.on("finish.pl",function(e,api){console.log("playlist_repeat",api.conf.loop,"advance",api.conf.advance,"video.loop",api.video.loop);if(api.conf.playlist_shuffle){api.play(random_seed.pop());if(random_seed.length==0)random_seed=randomize()}})}else if(root.find(".fv-fp-track-repeat").length==0&&api.conf.playlist.length==0){var button_track_repeat=jQuery('<strong class="fv-fp-track-repeat"><svg viewBox="0 0 80.333 71" width="18px" height="18px" class="fvp-icon fvp-replay-track"><use xlink:href="#fvp-replay-track"></use></svg></strong>');button_track_repeat.insertAfter(root.find(".fp-controls .fp-volume")).on("click",function(e){e.preventDefault();e.stopPropagation();jQuery(this).toggleClass("is-active fp-color-fill",api.video.loop);if(api.video.loop){api.video.loop=false}else{api.video.loop=true}});if(api.conf.loop){button_track_repeat.addClass("is-active fp-color-fill")}}}if(root.data("button-rewind")){if(root.find(".fv-fp-rewind").length==0){var button_rewind=jQuery('<span class="fv-fp-rewind"><svg viewBox="0 0 24 24" width="21px" height="21px" class="fvp-icon fvp-rewind"><use xlink:href="#fvp-rewind"></use></svg></span>');button_rewind.insertBefore(root.find(".fp-controls .fp-playbtn")).on("click",function(e){e.preventDefault();e.stopPropagation();api.seek(api.video.time-10)});button_rewind.toggle(!api.video.live)}if(root.find(".fv-fp-forward").length==0){var button_forward=jQuery('<span class="fv-fp-forward"><svg viewBox="0 0 24 24" width="21px" height="21px" class="fvp-icon fvp-forward"><use xlink:href="#fvp-forward"></use></svg></span>');button_forward.insertAfter(root.find(".fp-controls .fp-playbtn")).on("click",function(e){e.preventDefault();e.stopPropagation();api.seek(api.video.time+10)});button_forward.toggle(!api.video.live)}}}).bind("unload",function(){root.find(".fv-fp-no-picture").remove();root.find(".fv-fp-playlist").remove();root.find(".fv-fp-track-repeat").remove()});function array_shuffle(a){var j,x,i;for(i=a.length;i;i--){j=Math.floor(Math.random()*i);x=a[i-1];a[i-1]=a[j];a[j]=x}return a}function randomize(random_seed){random_seed=[];jQuery(api.conf.playlist).each(function(k,v){random_seed.push(k)});random_seed=array_shuffle(random_seed);console.log("FV Player Randomizer random seed:",random_seed);return random_seed}});flowplayer(function(api,root){var $root=jQuery(root),start_index=$root.data("playlist_start");if(typeof start_index=="undefined")return;function start_position_changer(){if($root.data("position_changed")!==1&&api.conf.playlist.length){start_index--;api.play(start_index);$root.data("position_changed",1)}}api.bind("unload",function(){start_index=$root.data("playlist_start");$root.removeData("position_changed");api.one("ready",start_position_changer)});api.one("ready",start_position_changer);jQuery(".fp-ui",root).on("click",function(){start_position_changer();$root.data("position_changed",1)})});document.addEventListener("custombox:overlay:close",function(e){console.log("FV Player: Custombox/Popup anything ligtbox closed");var $players=jQuery(this).find(".flowplayer");if($players.length==0)return;console.log("FV Player: Custombox/Popup anything ligtbox contains a player");$players.each(function(index,player){var api=jQuery(player).data("flowplayer");if(typeof api!="undefined"){if(api.playing){console.log("FV Player: Custombox/Popup anything ligtbox video pause");api.pause()}else if(api.loading){api.one("ready",function(){console.log("FV Player: Custombox/Popup anything ligtbox video unload");api.unload()})}}})});flowplayer(function(api,root){api.bind("finish",function(){var finished_at=api.video.time;if(api.video.loop){api.one("pause",function(){if(finished_at<=api.video.time){api.resume()}})}})});function fv_flowplayer_amazon_s3(hash,time){jQuery("#wpfp_"+hash).bind("error",function(e,api,error){var fv_fp_date=new Date;if(error.code==4&&fv_fp_date.getTime()>fv_fp_utime+parseInt(time)){jQuery(e.target).find(".fp-message").delay(500).queue(function(n){jQuery(this).html(fv_flowplayer_translations.video_expired);n()})}})}flowplayer(function(api,root){root=jQuery(root);root.find(".fp-logo").removeAttr("href");if(root.hasClass("no-controlbar")){var timelineApi=api.sliders.timeline;timelineApi.disable(true);api.bind("ready",function(){timelineApi.disable(true)})}jQuery(".fvfp_admin_error",root).remove();root.find(".fp-logo, .fp-header").on("click",function(e){if(e.target!==this)return;root.find(".fp-ui").trigger("click")});jQuery(".fvp-share-bar .sharing-facebook",root).append('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="#fff"><title>Facebook</title><path d="M11.9 5.2l-2.6 0 0-1.6c0-0.7 0.3-0.7 0.7-0.7 0.3 0 1.6 0 1.6 0l0-2.9 -2.3 0c-2.6 0-3.3 2-3.3 3.3l0 2 -1.6 0 0 2.9 1.6 0c0 3.6 0 7.8 0 7.8l3.3 0c0 0 0-4.2 0-7.8l2.3 0 0.3-2.9Z"/></svg>');jQuery(".fvp-share-bar .sharing-twitter",root).append('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="#fff"><title>Twitter</title><path d="M16 3.1c-0.6 0.3-1.2 0.4-1.9 0.5 0.7-0.4 1.2-1 1.4-1.8 -0.6 0.4-1.3 0.6-2.1 0.8 -0.6-0.6-1.4-1-2.4-1 -2 0.1-3.2 1.6-3.2 4 -2.7-0.1-5.1-1.4-6.7-3.4 -0.9 1.4 0.2 3.8 1 4.4 -0.5 0-1-0.1-1.5-0.4l0 0.1c0 1.6 1.1 2.9 2.6 3.2 -0.7 0.2-1.3 0.1-1.5 0.1 0.4 1.3 1.6 2.2 3 2.3 -1.6 1.7-4.6 1.4-4.8 1.3 1.4 0.9 3.2 1.4 5 1.4 6 0 9.3-5 9.3-9.3 0-0.1 0-0.3 0-0.4 0.6-0.4 1.2-1 1.6-1.7Z"/></svg>');jQuery(".fvp-share-bar .sharing-email",root).append('<svg xmlns="http://www.w3.org/2000/svg" height="16" viewBox="0 0 16 16" width="16" fill="#fff"><title>Email</title><path d="M8 10c0 0 0 0-1 0L0 6v7c0 1 0 1 1 1h14c1 0 1 0 1-1V6L9 10C9 10 8 10 8 10zM15 2H1C0 2 0 2 0 3v1l8 4 8-4V3C16 2 16 2 15 2z"/></svg>');jQuery(".fp-header",root).prepend(jQuery(".fvp-share-bar",root));if(api.conf.playlist.length){var show=true;var playlist=api.conf.playlist;if(playlist.length==2){if(typeof playlist[0].click!="undefined"&&typeof playlist[1].click=="undefined"){show=false}if(typeof playlist[0].click=="undefined"&&typeof playlist[1].click!="undefined"){show=false}}else if(playlist.length==3){if(typeof playlist[0].click!="undefined"&&typeof playlist[1].click=="undefined"&&typeof playlist[2].click!="undefined"){show=false}}if(show){var prev=jQuery('<a class="fp-icon fv-fp-prevbtn"></a>');var next=jQuery('<a class="fp-icon fv-fp-nextbtn"></a>');root.find(".fp-controls .fp-playbtn").before(prev).after(next);prev.on("click",function(){api.trigger("prev",[api]);api.prev()});next.on("click",function(){api.trigger("next",[api]);api.next()})}}if(typeof fv_player_editor_conf!="undefined"){root.on("click",".fvp-sharing > li",function(e){e.preventDefault();fv_player_notice(root,fv_player_editor_translations.link_notice,2e3);return false})}api.bind("pause resume finish unload ready",function(e,api){root.addClass("no-brand")});api.one("ready",function(){root.find(".fp-fullscreen").clone().appendTo(root.find(".fp-controls"))});api.on("ready",function(e,api,video){setTimeout(function(){jQuery(".fvp-share-bar",root).show();jQuery(".fv-player-buttons-wrap",root).appendTo(jQuery(".fv-player-buttons-wrap",root).parent().find(".fp-ui"))},100)});api.bind("finish",function(){var url=root.data("fv_redirect");if(url&&(typeof api.video.is_last=="undefined"||api.video.is_last)){location.href=url}});if(flowplayer.support.iOS&&flowplayer.support.iOS.version==11){api.bind("error",function(e,api,error){if(error.code==4)root.find(".fp-engine").hide()})}jQuery(document).on("contextmenu",".flowplayer",function(e){e.preventDefault()});api.one("ready",function(e,api,video){root.find(".fp-chromecast").insertAfter(root.find(".fp-header .fp-fullscreen"))});root.find(".fp-waiting").html('<div class="fp-preload"><b></b><b></b><b></b><b></b></div>');var id=root.attr("id"),alternative=!flowplayer.conf.native_fullscreen&&flowplayer.conf.mobile_alternative_fullscreen,events_enter="fakefullscreen",events_exit="fakefullscreen-exit";if(!flowplayer.support.fullscreen){events_enter+=" fullscreen";events_exit+=" fullscreen-exit"}api.bind(events_enter,function(e,api){jQuery("#wpadminbar, .nc_wrapper").hide();if(alternative||e.type=="fakefullscreen"){if(api.video.type=="video/youtube")return;root.before('<span data-fv-placeholder="'+id+'"></span>');root.appendTo("body")}});api.bind(events_exit,function(e,api,video){jQuery("#wpadminbar, .nc_wrapper").show();if(alternative||e.type=="fakefullscreen-exit"){jQuery("span[data-fv-placeholder="+id+"]").replaceWith(root)}})});(function(){var extension=function(flowplayer){flowplayer(function(api,root){if(!jQuery(root).data("speedb"))return;var support=flowplayer.support;if(!support.video||!support.inlineVideo)return;var common=flowplayer.common,bean=flowplayer.bean,ui=common.find(".fp-ui",root)[0],controlbar=common.find(".fp-controls",ui)[0],speeds=api.conf.speeds;bean.on(root,"click",".fp-speed",function(){var menu=common.find(".fp-speed-menu",root)[0];if(common.hasClass(menu,"fp-active"))api.hideMenu();else api.showMenu(menu)});bean.on(root,"click",".fp-speed-menu a",function(ev){var s=ev.target.getAttribute("data-speed");api.speed(s)});api.on("speed",function(ev,_a,rate){if(speeds.length>1){selectSpeed(rate)}}).on("ready",function(ev,api){removeMenu();if(flowplayer.support.android&&api.engine.engineName=="html5"&&api.video.type=="application/x-mpegurl")return;speeds=api.conf.speeds;if(speeds.length>1){createMenu()}});function removeMenu(){common.find(".fp-speed-menu",root).forEach(common.removeNode);common.find(".fp-speed",root).forEach(common.removeNode)}function round(val){return Math.round(val*100)/100}function createMenu(){controlbar.appendChild(common.createElement("strong",{className:"fp-speed"},api.currentSpeed+"x"));var menu=common.createElement("div",{className:"fp-menu fp-speed-menu",css:{width:"auto"}},"<strong>Speed</strong>");speeds.forEach(function(s){var a=common.createElement("a",{"data-speed":round(s)},round(s)+"x");menu.appendChild(a)});ui.appendChild(menu);selectSpeed(api.currentSpeed);jQuery(root).find(".fp-speed-menu strong").text(fv_flowplayer_translations.speed)}function selectSpeed(rate){common.find(".fp-speed",root)[0].innerHTML=rate+"x";common.find(".fp-speed-menu a",root).forEach(function(el){common.toggleClass(el,"fp-selected",el.getAttribute("data-speed")==rate);common.toggleClass(el,"fp-color",el.getAttribute("data-speed")==rate)})}})};if(typeof module==="object"&&module.exports)module.exports=extension;else if(typeof window.flowplayer==="function")extension(window.flowplayer)})();flowplayer(function(api,root){if(typeof fv_flowplayer_conf.disable_localstorage!="undefined"){return}api.on("speed",function(ev,_a,rate){try{window.localStorage.fv_player_speed=rate}catch(e){}});api.on("ready",function(){if(window.localStorage.fv_player_speed&&jQuery(root).find("strong.fp-speed").is(":visible")){api.speed(parseFloat(window.localStorage.fv_player_speed))}if(jQuery(root).data("volume")==0){api.mute(true,true)}})});flowplayer(function(api,root){root=jQuery(root);var last_tracked=-1;if(!api.conf.fv_stats||!api.conf.fv_stats.enabled&&(!root.data("fv_stats")||root.data("fv_stats")=="no"))return;api.on("ready finish",function(e,api){api.one("progress",function(e,api){if(root.data("fv_stats_data")){try{var player_post_data=root.data("fv_stats_data")}catch(e){return false}if(last_tracked==get_index())return;last_tracked=get_index();jQuery.post(api.conf.fv_stats.url,{blog_id:api.conf.fv_stats.blog_id,video_id:api.video.id?api.video.id:0,player_id:player_post_data.player_id,post_id:player_post_data.post_id,tag:"play"})}})}).on("finish",function(){last_tracked=-1});function get_index(){return api.video.index?api.video.index:0}});flowplayer(function(api,root){var $root=jQuery(root);var $playerDiv=$root.find(".fp-player");var sticky=$root.data("fvsticky");var globalSticky=false;var videoRatio=$root.data("ratio"),is_sticky=false;if(typeof videoRatio=="undefined"){videoRatio=.5625}if(flowplayer.conf.sticky_video==1&&typeof sticky=="undefined"){globalSticky=true}if(globalSticky||sticky){if(flowplayer.support.firstframe){var stickyPlace=flowplayer.conf.sticky_place;var stickyWidth=flowplayer.conf.sticky_width;if(stickyWidth==""){stickyWidth=380}var stickyHeight=stickyWidth*videoRatio;fv_player_sticky_video()}else{return}}function fv_player_sticky_video(){var change=false;var $window=jQuery(window),$flowplayerDiv=$root,top=$flowplayerDiv.offset().top,offset=Math.floor(top+$flowplayerDiv.outerHeight()/2);api.on("ready",function(){change=true});api.on("progress",function(){change=true});api.on("unload",function(){change=false;fv_player_sticky_class_remove();$root.removeClass("is-unSticky")});$window.on("resize",function(){if(!is_big_enough()){if(is_sticky){fv_player_sticky_class_remove()}return}top=$flowplayerDiv.offset().top;offset=Math.floor(top+$flowplayerDiv.outerHeight()/2)}).on("scroll",function(){if(!is_big_enough()){if(is_sticky){fv_player_sticky_class_remove()}return}top=$flowplayerDiv.offset().top;offset=Math.floor(top+$flowplayerDiv.outerHeight()/2);if($window.scrollTop()>offset&&change){if(jQuery("div.flowplayer.is-unSticky").length>0){console.log("unSticky",jQuery("div.flowplayer.is-unSticky").length);return false}else{fv_player_sticky_class_add()}}else{fv_player_sticky_class_remove();change=false}})}function fv_player_sticky_class_add(){if($playerDiv.hasClass("is-sticky-"+stickyPlace)){return}else{$playerDiv.addClass("is-sticky-"+stickyPlace);if($root.find("a.fp-sticky").length==0){$root.find("div.fp-header").prepend('<a class="fp-sticky fp-icon"></a>')}$playerDiv.css("width",stickyWidth);$playerDiv.css("height",stickyHeight);$playerDiv.css("max-height",stickyHeight);is_sticky=true;api.trigger("sticky",[api])}$playerDiv.parent(".flowplayer").addClass("is-stickable")}function fv_player_sticky_class_remove(){$playerDiv.removeClass("is-sticky-"+stickyPlace);$playerDiv.css("width","");$playerDiv.css("height","");$playerDiv.css("max-height","");$playerDiv.parent(".flowplayer").removeClass("is-stickable");if(is_sticky){is_sticky=false;api.trigger("sticky-exit",[api])}}function is_big_enough(){return jQuery(window).innerWidth()>=1020}});jQuery(function($){$(document).on("click","a.fp-sticky",function(){$("div.flowplayer.is-stickable").addClass("is-unSticky");var $playerDiv=$("div.flowplayer.is-stickable").find(".fp-player");$playerDiv.removeClass("is-sticky-right-bottom");$playerDiv.removeClass("is-sticky-left-bottom");$playerDiv.removeClass("is-sticky-right-top");$playerDiv.removeClass("is-sticky-left-top");$playerDiv.css("width","");$playerDiv.css("height","");$playerDiv.css("max-height","");if(is_sticky){is_sticky=false;api.trigger("sticky-exit",[api])}});$(document).on("click","div.flowplayer.is-unSticky",function(){$("div.flowplayer").removeClass("is-unSticky")})});flowplayer(function(api,root){root=jQuery(root);if(typeof fv_flowplayer_conf.disable_localstorage!="undefined"){return}var ls=window.localStorage;api.on("ready",function(e,api,video){if(root.find("strong.fp-cc").is(":visible")){if(ls.fv_player_subtitle&&api.video.subtitles.length){if(ls.fv_player_subtitle==="none"){api.disableSubtitles()}else{api.video.subtitles.forEach(function(item,index){if(item.srclang===ls.fv_player_subtitle){api.loadSubtitles(index)}})}}else{var defaultSubtitle=video.subtitles.filter(function(one){return one["fv_default"]})[0];if(defaultSubtitle){api.loadSubtitles(video.subtitles.indexOf(defaultSubtitle))}}}root.find(".fp-subtitle-menu").on("click",function(e){var subtitle_index=e.target.getAttribute("data-subtitle-index");if(typeof subtitle_index=="string"){try{ls.fv_player_subtitle=subtitle_index>-1?api.video.subtitles[subtitle_index].srclang:"none"}catch(e){}}})})});flowplayer(function(api,root){root=jQuery(root);var currentPoint,check=false;api.bind("cuepoint",function(e,api,cue){check=false;if(cue.subtitle){currentPoint=cue.index}});api.on("ready",function(e,api){root.find(".fp-subtitle-menu strong").text(fv_flowplayer_translations.closed_captions);root.find('.fp-subtitle-menu a[data-subtitle-index="-1"]').text(fv_flowplayer_translations.no_subtitles)});root.on("click",".fp-subtitle-menu a[data-subtitle-index]",function(e){if(jQuery(this).data("subtitle-index")>-1){check=true;api.on("progress",time_check)}});function time_check(e,api,time){if(check){(api.cuepoints||[]).forEach(function(cue,index){var entry=cue.subtitle;if(entry&&currentPoint!=index){if(time>=cue.time&&(!entry.endTime||time<=entry.endTime)){api.trigger("cuepoint",[api,cue])}}})}}});if(typeof flowplayer!=="undefined"&&typeof fv_flowplayer_conf!="undefined"&&fv_flowplayer_conf.video_hash_links){flowplayer(function(api,root){if(jQuery(root).find(".sharing-link").length>0){var abEnd,abStart,hash,sTime,abloop;function update_link(abStartNew,abEndNew){hash=fv_player_get_video_link_hash(api);sTime=","+fv_player_time_hms(api.video.time);if(abStartNew&&abEndNew){abStart=","+fv_player_time_hms_ms(abStartNew+api.get_custom_start());abEnd=","+fv_player_time_hms_ms(abEndNew+api.get_custom_start())}else{abEnd=abloop&&typeof api.get_ab_end()!="undefined"&&api.get_ab_end()?","+fv_player_time_hms_ms(api.get_ab_end()):"";abStart=abloop&&typeof api.get_ab_start()!="undefined"&&api.get_ab_start()?","+fv_player_time_hms_ms(api.get_ab_start()):""}jQuery(".sharing-link",root).attr("href",jQuery(".sharing-link",root).attr("href").replace(/#.*/,"")+"#"+hash+sTime+abStart+abEnd)}api.on("ready",function(e,api,video){if(!api.fv_noUiSlider)return;api.fv_noUiSlider.on("set",function(values){update_link(values[0],values[1])})});api.on("progress",function(e,api){if(!api.video.sources||!api.video.sources[0]){return}update_link()});api.on("abloop",function(e,api,active){abloop=active;if(!api.playing){update_link()}});jQuery(".sharing-link",root).on("click",function(e){fv_player_clipboard(jQuery(this).attr("href"),function(){e.preventDefault();fv_player_notice(root,fv_flowplayer_translations.link_copied,2e3)})})}});jQuery(document).on("click",'a[href*="fvp_"]',function(){var link=jQuery(this);setTimeout(function(){if(link.parents(".fvp-share-bar").length==0)fv_autoplay_exec()})})}flowplayer(function(api,root){root=jQuery(root);var bean=flowplayer.bean;var restore=flowplayer.conf.default_volume;root.on("mousedown touchstart",".fp-volumebtn",function(e){var volumebtn=jQuery(this);if(api.volumeLevel==0){volumebtn.one("click",function(){api.volume(restore);return false})}});root.on("mousedown touchstart mouseup touchend",".fp-volumebar",function(e){if(api.volumeLevel!=0){restore=api.volumeLevel}});api.on("volume",function(e,api){if(root.hasClass("is-mouseover")&&!api.muted){if(api.volumeLevel==0){bean.off(flowplayer.support.touch?root:document,"mousemove.sld touchmove.sld");api.mute(true)}}});var deal_with_muted_start=false;api.one("ready",function(e,api){if(root.hasClass("is-audio"))return;deal_with_muted_start=true});api.on("progress",function(e,api,time){if(deal_with_muted_start&&time>1){deal_with_muted_start=false;var video=jQuery("root").find("video");if(video.length&&!hasAudio(video[0])){return}if(api.muted||api.volumeLevel==0){if(localStorage.muted=="true"||localStorage.volume=="0"){return}var mute_notice=jQuery('<div class="fp-message fp-message-muted"><span class="fp-icon fp-volumebtn-notice"></span> '+fv_flowplayer_translations.click_to_unmute+"</div>");mute_notice.on("click touchstart",function(){api.mute(false);api.volume(1)});root.find(".fp-ui").append(mute_notice);root.addClass("has-fp-message-muted");setTimeout(remove_volume_notice,5e3)}}});api.on("mute volume",function(){if(!api.muted||api.volumeLevel>0){remove_volume_notice()}});function remove_volume_notice(){root.removeClass("has-fp-message-muted");root.find(".fp-message-muted").remove()}function hasAudio(video){return video.mozHasAudio||Boolean(video.webkitAudioDecodedByteCount)||Boolean(video.audioTracks&&video.audioTracks.length)}});if(typeof flowplayer!="undefined"){flowplayer(function(api,root){root=jQuery(root);if(navigator.userAgent.match(/iPhone.* OS [0-6]_/i)){api.one("progress",function(e){if(typeof api.video.subtitles!=="undefined"&&api.video.subtitles.length){fv_player_warning(root,fv_flowplayer_translations.warning_iphone_subs)}})}if(flowplayer.support.android&&flowplayer.support.android.version<5&&(flowplayer.support.android.samsung||flowplayer.support.browser.safari)){fv_player_warning(root,fv_flowplayer_translations.warning_unstable_android,"firefox")}if(/Android 4/.test(navigator.userAgent)&&!/Firefox/.test(navigator.userAgent)){api.on("ready",function(e,api,video){setTimeout(function(){if(video.src&&video.src.match(/fpdl.vimeocdn.com/)&&(video.time==0||video.time==1)){fv_player_warning(root,fv_flowplayer_translations.warning_unstable_android,"firefox");api.on("progress",function(e,api){root.prev().find(".fv-player-warning-firefox").remove()})}},1500)});api.on("error",function(e,api,error){if(error.MEDIA_ERR_NETWORK==2&&error.video.src.match(/fpdl.vimeocdn.com/)){fv_player_warning(root,fv_flowplayer_translations.warning_unstable_android,"firefox")}})}if(/Safari/.test(navigator.userAgent)&&/Version\/5/.test(navigator.userAgent)){api.on("error",function(e,api,error){if(error.video.src.match(/fpdl.vimeocdn.com/)){fv_player_warning(root,fv_flowplayer_translations.warning_old_safari)}})}var sup=flowplayer.support;if(sup.android&&(sup.android.samsung&&parseInt(sup.browser.version)<66||sup.browser.safari)){api.on("error",function(e,api,error){fv_player_warning(root,fv_flowplayer_translations.warning_samsungbrowser,"warning_samsungbrowser")})}});function fv_player_warning(root,warning,classname){var wrapper=jQuery(root).prev(".fv-player-warning-wrapper");if(wrapper.length==0){jQuery(root).before('<div class="fv-player-warning-wrapper">');wrapper=jQuery(root).prev(".fv-player-warning-wrapper")}if(wrapper.find(".fv-player-warning-"+classname).length==0){var latest=jQuery("<p style='display: none' "+(classname?" class='fv-player-warning-"+classname+"'":"")+">"+warning+"</p>");wrapper.append(latest);latest.slideDown()}}}
flowplayer/modules/abr-remember.module.js CHANGED
@@ -4,6 +4,10 @@
4
  flowplayer( function(api,root) {
5
  root = jQuery(root);
6
 
 
 
 
 
7
  var hlsjs;
8
 
9
  // this is the proper place to pick the initial HLS video quality
4
  flowplayer( function(api,root) {
5
  root = jQuery(root);
6
 
7
+ if( typeof api.conf.disable_localstorage !='undefined' ) {
8
+ return;
9
+ }
10
+
11
  var hlsjs;
12
 
13
  // this is the proper place to pick the initial HLS video quality
flowplayer/modules/appearance.module.js CHANGED
@@ -141,12 +141,15 @@ flowplayer(function(api, root) {
141
  * Tabbed playlist
142
  */
143
  jQuery(document).on("tabsactivate", '.fv_flowplayer_tabs_content', function(event, ui){
144
- var oldPlayer = jQuery('.flowplayer.is-playing').data('flowplayer');
 
 
145
  if( typeof(oldPlayer) != "undefined" ) {
146
  oldPlayer.pause();
147
  }
148
-
 
149
  var objPlayer = jQuery('.flowplayer',ui.newPanel);
150
  var api = objPlayer.data('flowplayer');
151
- api.load();
152
  });
141
  * Tabbed playlist
142
  */
143
  jQuery(document).on("tabsactivate", '.fv_flowplayer_tabs_content', function(event, ui){
144
+ var oldPlayer = jQuery( ui.oldPanel ).find('.flowplayer').data('flowplayer');
145
+
146
+ // pause old player to make sure it does not keep playing while the new video is loading
147
  if( typeof(oldPlayer) != "undefined" ) {
148
  oldPlayer.pause();
149
  }
150
+
151
+ // load new player
152
  var objPlayer = jQuery('.flowplayer',ui.newPanel);
153
  var api = objPlayer.data('flowplayer');
154
+ api.load();
155
  });
flowplayer/modules/embed.module.js CHANGED
@@ -5,7 +5,7 @@ flowplayer(function(player, root) {
5
  root = jQuery(root);
6
  if( typeof(root.data('fv-embed')) == 'undefined' || !root.data('fv-embed') || root.data('fv-embed') == 'false' ) return;
7
 
8
- player.embedCode = function() {
9
  var video = player.video;
10
  var width = root.width();
11
  var height = root.height();
@@ -28,19 +28,27 @@ flowplayer(function(player, root) {
28
  });
29
 
30
  jQuery(document).on('click', '.flowplayer .embed-code-toggle', function() {
 
 
 
 
 
 
 
 
31
  var button = jQuery(this);
32
  var player = button.parents('.flowplayer');
33
  var api = player.data('flowplayer');
34
  if( typeof(api.embedCode) == 'function') {
35
  player.find('.embed-code textarea').val(api.embedCode());
36
  }
37
-
38
  fv_player_clipboard( player.find('.embed-code textarea').val(), function() {
39
  fv_player_notice(player,fv_flowplayer_translations.embed_copied,2000);
40
  }, function() {
41
  button.parents('.fvp-share-bar').find('.embed-code').toggle();
42
  button.parents('.fvp-share-bar').toggleClass('visible');
43
  });
44
-
45
  return false;
46
  } );
5
  root = jQuery(root);
6
  if( typeof(root.data('fv-embed')) == 'undefined' || !root.data('fv-embed') || root.data('fv-embed') == 'false' ) return;
7
 
8
+ player.embedCode = function() {
9
  var video = player.video;
10
  var width = root.width();
11
  var height = root.height();
28
  });
29
 
30
  jQuery(document).on('click', '.flowplayer .embed-code-toggle', function() {
31
+ var root = jQuery(this).closest('.flowplayer');
32
+
33
+ // show notice in editor
34
+ if( typeof fv_player_editor_conf != 'undefined') {
35
+ fv_player_notice( root, fv_player_editor_translations.embed_notice , 2000 );
36
+ return false;
37
+ }
38
+
39
  var button = jQuery(this);
40
  var player = button.parents('.flowplayer');
41
  var api = player.data('flowplayer');
42
  if( typeof(api.embedCode) == 'function') {
43
  player.find('.embed-code textarea').val(api.embedCode());
44
  }
45
+
46
  fv_player_clipboard( player.find('.embed-code textarea').val(), function() {
47
  fv_player_notice(player,fv_flowplayer_translations.embed_copied,2000);
48
  }, function() {
49
  button.parents('.fvp-share-bar').find('.embed-code').toggle();
50
  button.parents('.fvp-share-bar').toggleClass('visible');
51
  });
52
+
53
  return false;
54
  } );
flowplayer/modules/fv-player.js CHANGED
@@ -15,7 +15,12 @@ if( typeof(fv_flowplayer_conf) != "undefined" ) {
15
  flowplayer.conf.embed = false;
16
  flowplayer.conf.share = false;
17
  flowplayer.conf.analytics = false;
18
-
 
 
 
 
 
19
  // we had a problem that some websites would change the key in HTML if stored as $62\d+
20
  try {
21
  flowplayer.conf.key = atob(flowplayer.conf.key);
@@ -652,11 +657,11 @@ function fv_player_time_hms(seconds) {
652
  }
653
 
654
  // leading zero for minutes
655
- if ( hours && minutes < 10) { // ecample: 1h05m
656
  minutes = "0" + minutes + "m";
657
- } else if( !hours && minutes ) {
658
- minutes += "m";
659
- } else {
660
  minutes = "";
661
  }
662
 
@@ -912,7 +917,7 @@ function fv_autoplay_exec(){
912
  } else {
913
  fv_player_did_autoplay = true;
914
 
915
- if( api.conf.playlist.length && jQuery.isNumeric(autoplay) ) {
916
  api.play( parseInt(autoplay) );
917
  } else {
918
  api.load();
15
  flowplayer.conf.embed = false;
16
  flowplayer.conf.share = false;
17
  flowplayer.conf.analytics = false;
18
+
19
+ // localstorage disabled by admin
20
+ if( typeof(fv_flowplayer_conf.disable_localstorage) != 'undefined' ) {
21
+ flowplayer.conf.storage = {} // set empty to disable
22
+ }
23
+
24
  // we had a problem that some websites would change the key in HTML if stored as $62\d+
25
  try {
26
  flowplayer.conf.key = atob(flowplayer.conf.key);
657
  }
658
 
659
  // leading zero for minutes
660
+ if ( hours && minutes < 10) { // example: 1h05m
661
  minutes = "0" + minutes + "m";
662
+ } else if( minutes ) { // example: 1h15m, 15m20s
663
+ minutes += "m";
664
+ } else { // example: 15s
665
  minutes = "";
666
  }
667
 
917
  } else {
918
  fv_player_did_autoplay = true;
919
 
920
+ if( api.conf.playlist.length && !isNaN(parseFloat(autoplay)) && isFinite(autoplay) ) {
921
  api.play( parseInt(autoplay) );
922
  } else {
923
  api.load();
flowplayer/modules/hls-audio.module.js CHANGED
@@ -55,10 +55,10 @@ flowplayer( function(api,root) {
55
  return;
56
  }
57
 
58
- hls_audio_button = jQuery('<strong class="fv-fp-hls">AUD</strong>');
59
  hls_audio_menu = jQuery('<div class="fp-menu fv-fp-hls-menu"></div>').insertAfter( root.find('.fp-controls') );
60
 
61
- hls_audio_menu.append('<strong>Audio</strong>');
62
 
63
  // audio options
64
  audioUXGroup.forEach(function (audioTrack) {
55
  return;
56
  }
57
 
58
+ hls_audio_button = jQuery('<strong class="fv-fp-hls">' + fv_flowplayer_translations.audio_button + '</strong>');
59
  hls_audio_menu = jQuery('<div class="fp-menu fv-fp-hls-menu"></div>').insertAfter( root.find('.fp-controls') );
60
 
61
+ hls_audio_menu.append('<strong>' + fv_flowplayer_translations.audio_menu + '</strong>');
62
 
63
  // audio options
64
  audioUXGroup.forEach(function (audioTrack) {
flowplayer/modules/hls-safari-fixes.module.js CHANGED
@@ -42,7 +42,7 @@ flowplayer( function(api,root) {
42
  api.bind('beforeseek', wait_for_stalled );
43
 
44
  function debug(e) {
45
- console.log("FV PLayer: iOS video element: " + e.type);
46
  }
47
 
48
  function wait_for_stalled() {
@@ -57,13 +57,13 @@ flowplayer( function(api,root) {
57
  are_waiting_already++;
58
  if( are_waiting_already > 1 ) {
59
  if( are_waiting_already > 3 ) {
60
- console.log("FV PLayer: iOS video element needs a push, triggering 'stalled'");
61
  video_tag.trigger( "stalled" );
62
  }
63
  return;
64
  }
65
 
66
- console.log("FV PLayer: iOS video element will trigger error after 'stalled' arrives");
67
 
68
  // then it also triggers this event if it really fails to load more
69
  video_tag.one( "stalled", function() {
@@ -71,7 +71,7 @@ flowplayer( function(api,root) {
71
 
72
  // simple video files can be checked directly
73
  if( api.video.type.match(/video\//) ) {
74
- console.log("FV PLayer: Running check of video file...");
75
 
76
  // create a new video tag and let iOS fetch the meta data
77
  var test_video = document.createElement('video');
@@ -97,13 +97,13 @@ flowplayer( function(api,root) {
97
 
98
  // did the video advance?
99
  if( api.video.time != time ) {
100
- console.log("FV PLayer: iOS video element continues playing, no need for error");
101
  return;
102
  }
103
 
104
  // the video is paused, so it should not progress and it's fine
105
  if( api.paused ) {
106
- console.log("FV PLayer: iOS video element paused, no need for error");
107
  return;
108
  }
109
 
42
  api.bind('beforeseek', wait_for_stalled );
43
 
44
  function debug(e) {
45
+ console.log("FV Player: iOS video element: " + e.type);
46
  }
47
 
48
  function wait_for_stalled() {
57
  are_waiting_already++;
58
  if( are_waiting_already > 1 ) {
59
  if( are_waiting_already > 3 ) {
60
+ console.log("FV Player: iOS video element needs a push, triggering 'stalled'");
61
  video_tag.trigger( "stalled" );
62
  }
63
  return;
64
  }
65
 
66
+ console.log("FV Player: iOS video element will trigger error after 'stalled' arrives");
67
 
68
  // then it also triggers this event if it really fails to load more
69
  video_tag.one( "stalled", function() {
71
 
72
  // simple video files can be checked directly
73
  if( api.video.type.match(/video\//) ) {
74
+ console.log("FV Player: Running check of video file...");
75
 
76
  // create a new video tag and let iOS fetch the meta data
77
  var test_video = document.createElement('video');
97
 
98
  // did the video advance?
99
  if( api.video.time != time ) {
100
+ console.log("FV Player: iOS video element continues playing, no need for error");
101
  return;
102
  }
103
 
104
  // the video is paused, so it should not progress and it's fine
105
  if( api.paused ) {
106
+ console.log("FV Player: iOS video element paused, no need for error");
107
  return;
108
  }
109
 
flowplayer/modules/pending-encoding.module.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if( typeof(flowplayer) !== "undefined" ) {
2
+ flowplayer( function(api,root) {
3
+ root = jQuery(root);
4
+
5
+ var notice = false,
6
+ hlsjs;
7
+
8
+ // We need some special handling for HLS JS
9
+ // TODO: Figure out the core Flowplayer issue here
10
+ flowplayer.engine('hlsjs-lite').plugin(function(params) {
11
+ hlsjs = params.hls;
12
+ });
13
+
14
+ // Do we need to show the notice right away?
15
+ var playlist = api.conf.playlist.length ? api.conf.playlist : [ api.conf.clip ];
16
+ if( playlist[0].pending_encoding) {
17
+ show_notice(playlist[0]);
18
+ }
19
+
20
+ api.on('load', function(e,api,video) {
21
+ if( video.pending_encoding ) {
22
+ show_notice(video);
23
+ if( hlsjs ) {
24
+ hlsjs.destroy();
25
+ }
26
+
27
+ // Block further loading
28
+ return false;
29
+ }
30
+
31
+ remove_notice();
32
+ });
33
+
34
+ function show_notice(video) {
35
+ remove_notice();
36
+
37
+ var title = 'Video is being processed',
38
+ message = 'Please return later to see the actual video in this player.';
39
+
40
+ if( video.pending_encoding_error ) {
41
+ title = 'Video unavailable';
42
+ message = 'There was an error in the video encoding.';
43
+ } else if( video.pending_encoding_progress ) {
44
+ message += '<br /><br />('+video.pending_encoding_progress+' done)';
45
+ }
46
+
47
+ notice = jQuery('<div class="fv-player-encoder-video-processing-modal"><div><h2>'+title+'</h2><p>'+message+'</p></div></div');
48
+ root.append(notice);
49
+ }
50
+
51
+ function remove_notice() {
52
+ if( notice ) {
53
+ notice.remove();
54
+ }
55
+ }
56
+ })
57
+ }
flowplayer/modules/playback-position.module.js CHANGED
@@ -16,10 +16,13 @@ if (!Date.now) {
16
  // maximum cookie size with saved video positions we should store
17
  maxCookieSize = 2500,
18
  localStorageEnabled = null,
19
- cookieKeyName = 'video_positions',
 
20
  tempPositionCookieKeyName = 'video_positions_tmp',
 
21
  tempSawCookieKeyName = 'video_saw_tmp',
22
  playPositions = [],
 
23
  sawVideo = [],
24
 
25
  getSerialized = function(data) {
@@ -121,20 +124,34 @@ if (!Date.now) {
121
  callback = function() {};
122
  }
123
 
124
- postData = [];
 
125
 
126
  for (var video_name in playPositions) {
127
  if( !playPositions.hasOwnProperty(video_name) ) continue;
128
 
129
  // remove all AWS signatures from this video
130
- postData.push({
131
  name: video_name,
132
  position: playPositions[video_name],
133
  saw: typeof(sawVideo[video_name]) != "undefined" ? sawVideo[video_name] : false
134
  });
135
  }
136
 
137
- if (!postData.length) {
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  // no video positions? remove the temporary position cookie/localStorage data as well
139
  removeCookieKey(tempPositionCookieKeyName);
140
  removeCookieKey(tempSawCookieKeyName);
@@ -148,18 +165,26 @@ if (!Date.now) {
148
  // which will get removed on next page load
149
  try {
150
  var temp_position_data = {},
151
- temp_saw_data = {};
 
152
 
153
  // add our video positions
154
- for (var i in postData) {
155
- if( !postData.hasOwnProperty(i) ) continue;
156
 
157
- temp_position_data[postData[i].name] = postData[i].position;
158
- temp_saw_data[postData[i].name] = postData[i].saw;
 
 
 
 
 
 
159
  }
160
 
161
  setCookieKey(tempPositionCookieKeyName, getSerialized(temp_position_data));
162
  setCookieKey(tempSawCookieKeyName, getSerialized(temp_saw_data));
 
163
  } catch (e) {
164
  // JSON JS support missing
165
  return;
@@ -167,7 +192,8 @@ if (!Date.now) {
167
 
168
  var fd = new FormData();
169
  fd.append('action', 'fv_wp_flowplayer_video_position_save');
170
- fd.append('videoTimes', encodeURIComponent(JSON.stringify(postData)));
 
171
  navigator.sendBeacon(fv_player.ajaxurl, fd);
172
 
173
  // return false, so no ajax.abort() will be tried if multiple players try to call this same script part
@@ -181,52 +207,85 @@ if (!Date.now) {
181
  complete: callback,
182
  data: {
183
  action: 'fv_wp_flowplayer_video_position_save',
184
- videoTimes: postData
 
185
  }
186
  });
187
  }
188
  } else {
189
- // guest visitor, store position in a cookie / localStorage
190
  try {
191
- var data = getCookieKey(cookieKeyName);
192
- if (data && typeof(data) !== 'undefined') {
193
- data = JSON.parse(data);
 
 
 
 
 
 
 
 
194
  } else {
195
- data = {};
196
  }
197
 
198
  // add / edit our video positions
199
- for (var i in postData) {
200
- if( !postData.hasOwnProperty(i) ) continue;
 
 
 
 
 
 
201
 
202
- data[postData[i].name] = postData[i].position;
203
  }
204
 
205
  var
206
- serialized = JSON.stringify(data),
207
- dataSize = getTextByteSize(serialized);
 
 
208
 
209
  // check if we're not going over maximum cache size
210
- if (dataSize > maxCookieSize) {
211
  // we're over max cache size, let's delete some older videos
212
- while (dataSize > maxCookieSize) {
213
  // remove the first entry only
214
- for (var i in data) {
215
- if( !data.hasOwnProperty(i) ) continue;
216
 
217
- delete data[i];
218
 
219
  // re-serialize with the value removed
220
- serialized = JSON.stringify(data);
221
- // calculate new data size, so we can exit the while loop
222
- dataSize = getTextByteSize(serialized);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
  break;
225
  }
226
  }
227
  }
228
 
229
- setCookieKey(cookieKeyName, serialized);
 
230
  } catch (e) {
231
  // JSON JS support missing
232
  return;
@@ -237,10 +296,17 @@ if (!Date.now) {
237
  };
238
 
239
  flowplayer( function(api,root) {
 
 
 
 
 
240
  var
241
  $root = jQuery(root),
242
  enabled = flowplayer.conf.video_position_save_enable && $root.data('save-position') != 'false' || $root.data('save-position'),
243
  progressEventsCount = 0,
 
 
244
 
245
  // used to seek into the desired last stored position when he video has started
246
  seekIntoPosition = function (e, api) {
@@ -252,7 +318,7 @@ if (!Date.now) {
252
 
253
  // try to lookup position of a guest visitor
254
  if (flowplayer.conf.is_logged_in != '1') {
255
- var data = getCookieKey(cookieKeyName);
256
  if (data && typeof(data) !== 'undefined') {
257
  try {
258
  data = JSON.parse(data);
@@ -302,6 +368,10 @@ if (!Date.now) {
302
 
303
  playPositions[video_id] = position;
304
 
 
 
 
 
305
  // make a call home every +-30 seconds to make sure a browser crash doesn't affect the position save too much
306
  // if (progressEventsCount++ >= sendPositionsEvery) {
307
  // ... refactor: only store position when we're leaving the page now, not on player progress
@@ -390,12 +460,46 @@ if (!Date.now) {
390
  // something went wrong, so the next block will continue
391
  }
392
  }
393
- }
394
 
395
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
396
 
397
  if( !enabled ) return;
398
 
 
 
 
 
 
 
399
  // stop events
400
  api.bind('finish', removeVideoPosition);
401
 
@@ -405,6 +509,17 @@ if (!Date.now) {
405
  // to use progress
406
  api.one( 'progress', seekIntoPosition);
407
 
 
 
 
 
 
 
 
 
 
 
 
408
  /**
409
  * Show the progress on the playlist item thumbnail
410
  *
@@ -435,7 +550,7 @@ if (!Date.now) {
435
 
436
  var progress = 100 * position/duration;
437
  el.css('width',progress+'%');
438
- }
439
 
440
  // Check all the playlist items to see if any of them has the temporary "position" or "saw" cookie set
441
  // We do this as the position saving Ajax can no longer be synchronous and block the page reload
@@ -500,6 +615,11 @@ if (!Date.now) {
500
  }
501
  });
502
 
 
 
 
 
 
503
  // check whether local storage is enabled
504
  if (localStorageEnabled !== null) {
505
  return localStorageEnabled;
@@ -516,4 +636,4 @@ if (!Date.now) {
516
  localStorageEnabled = false;
517
  }
518
 
519
- })(jQuery);
16
  // maximum cookie size with saved video positions we should store
17
  maxCookieSize = 2500,
18
  localStorageEnabled = null,
19
+ cookiePositionsKeyName = 'video_positions',
20
+ cookiePlaylistsKeyName = 'player_playlist_item',
21
  tempPositionCookieKeyName = 'video_positions_tmp',
22
+ tempPlaylistsCookieKeyName = 'player_playlist_item_tmp',
23
  tempSawCookieKeyName = 'video_saw_tmp',
24
  playPositions = [],
25
+ playlistIndexes = [],
26
  sawVideo = [],
27
 
28
  getSerialized = function(data) {
124
  callback = function() {};
125
  }
126
 
127
+ postDataPositions = [];
128
+ postDataPlaylists = [];
129
 
130
  for (var video_name in playPositions) {
131
  if( !playPositions.hasOwnProperty(video_name) ) continue;
132
 
133
  // remove all AWS signatures from this video
134
+ postDataPositions.push({
135
  name: video_name,
136
  position: playPositions[video_name],
137
  saw: typeof(sawVideo[video_name]) != "undefined" ? sawVideo[video_name] : false
138
  });
139
  }
140
 
141
+ for (var player_id in playlistIndexes) {
142
+ if( !playlistIndexes.hasOwnProperty(player_id) ) continue;
143
+
144
+ postDataPlaylists.push({
145
+ player: player_id,
146
+ item: playlistIndexes[player_id]
147
+ });
148
+ }
149
+
150
+ if (!postDataPlaylists.length) {
151
+ removeCookieKey(tempPlaylistsCookieKeyName);
152
+ }
153
+
154
+ if (!postDataPositions.length) {
155
  // no video positions? remove the temporary position cookie/localStorage data as well
156
  removeCookieKey(tempPositionCookieKeyName);
157
  removeCookieKey(tempSawCookieKeyName);
165
  // which will get removed on next page load
166
  try {
167
  var temp_position_data = {},
168
+ temp_saw_data = {},
169
+ temp_playlist_data = {};
170
 
171
  // add our video positions
172
+ for (var i in postDataPositions) {
173
+ if( !postDataPositions.hasOwnProperty(i) ) continue;
174
 
175
+ temp_position_data[postDataPositions[i].name] = postDataPositions[i].position;
176
+ temp_saw_data[postDataPositions[i].name] = postDataPositions[i].saw;
177
+ }
178
+
179
+ // playlist and item
180
+ for (var i in postDataPlaylists) {
181
+ if( !postDataPlaylists.hasOwnProperty(i) ) continue;
182
+ temp_playlist_data[postDataPlaylists[i].player] = postDataPlaylists[i].item;
183
  }
184
 
185
  setCookieKey(tempPositionCookieKeyName, getSerialized(temp_position_data));
186
  setCookieKey(tempSawCookieKeyName, getSerialized(temp_saw_data));
187
+ setCookieKey(tempPlaylistsCookieKeyName, getSerialized(temp_playlist_data));
188
  } catch (e) {
189
  // JSON JS support missing
190
  return;
192
 
193
  var fd = new FormData();
194
  fd.append('action', 'fv_wp_flowplayer_video_position_save');
195
+ fd.append('videoTimes', encodeURIComponent(JSON.stringify(postDataPositions)));
196
+ fd.append('playlistItems', encodeURIComponent(JSON.stringify(postDataPlaylists)));
197
  navigator.sendBeacon(fv_player.ajaxurl, fd);
198
 
199
  // return false, so no ajax.abort() will be tried if multiple players try to call this same script part
207
  complete: callback,
208
  data: {
209
  action: 'fv_wp_flowplayer_video_position_save',
210
+ videoTimes: postDataPositions,
211
+ playlistItems: postDataPlaylists
212
  }
213
  });
214
  }
215
  } else {
216
+ // guest visitor, store position and item in a cookie / localStorage
217
  try {
218
+ var data_positions = getCookieKey(cookiePositionsKeyName);
219
+ var data_playlist_item = getCookieKey(cookiePlaylistsKeyName);
220
+
221
+ if (data_positions && typeof(data_positions) !== 'undefined') {
222
+ data_positions = JSON.parse(data_positions);
223
+ } else {
224
+ data_positions = {};
225
+ }
226
+
227
+ if (data_playlist_item && typeof(data_playlist_item) !== 'undefined') {
228
+ data_playlist_item = JSON.parse(data_playlist_item);
229
  } else {
230
+ data_playlist_item = {};
231
  }
232
 
233
  // add / edit our video positions
234
+ for (var i in postDataPositions) {
235
+ if( !postDataPositions.hasOwnProperty(i) ) continue;
236
+
237
+ data_positions[postDataPositions[i].name] = postDataPositions[i].position;
238
+ }
239
+
240
+ for (var i in postDataPlaylists) {
241
+ if( !postDataPlaylists.hasOwnProperty(i) ) continue;
242
 
243
+ data_playlist_item[postDataPlaylists[i].player] = postDataPlaylists[i].item;
244
  }
245
 
246
  var
247
+ serialized_positions = JSON.stringify(data_positions),
248
+ serialized_playlist_items = JSON.stringify(data_playlist_item),
249
+ dataSize_postions = getTextByteSize(serialized_positions),
250
+ dataSize_playlist_items = getTextByteSize(serialized_playlist_items);
251
 
252
  // check if we're not going over maximum cache size
253
+ if (dataSize_postions > maxCookieSize) {
254
  // we're over max cache size, let's delete some older videos
255
+ while (dataSize_postions > maxCookieSize) {
256
  // remove the first entry only
257
+ for (var i in data_positions) {
258
+ if( !data_positions.hasOwnProperty(i) ) continue;
259
 
260
+ delete data_positions[i];
261
 
262
  // re-serialize with the value removed
263
+ serialized_positions = JSON.stringify(data_positions);
264
+ // calculate new data_positions size, so we can exit the while loop
265
+ dataSize_postions = getTextByteSize(serialized_positions);
266
+
267
+ break;
268
+ }
269
+ }
270
+ }
271
+
272
+ // do the same for playlist item
273
+ if (dataSize_playlist_items > maxCookieSize) {
274
+ while (dataSize_playlist_items > maxCookieSize) {
275
+ for (var i in data_positions) {
276
+ if( !data_playlist_item.hasOwnProperty(i) ) continue;
277
+ delete data_playlist_item[i];
278
+
279
+ serialized_playlist_items = JSON.stringify(data_playlist_item);
280
+ dataSize_playlist_items = getTextByteSize(serialized_positions);
281
 
282
  break;
283
  }
284
  }
285
  }
286
 
287
+ setCookieKey(cookiePositionsKeyName, serialized_positions);
288
+ setCookieKey(cookiePlaylistsKeyName, serialized_playlist_items);
289
  } catch (e) {
290
  // JSON JS support missing
291
  return;
296
  };
297
 
298
  flowplayer( function(api,root) {
299
+ // localstorage disabled by admin
300
+ if( typeof(api.conf.disable_localstorage) != 'undefined' ) {
301
+ return;
302
+ }
303
+
304
  var
305
  $root = jQuery(root),
306
  enabled = flowplayer.conf.video_position_save_enable && $root.data('save-position') != 'false' || $root.data('save-position'),
307
  progressEventsCount = 0,
308
+ player_id = $root.data('player-id') ? $root.data('player-id') : false,
309
+ item_changed = false,
310
 
311
  // used to seek into the desired last stored position when he video has started
312
  seekIntoPosition = function (e, api) {
318
 
319
  // try to lookup position of a guest visitor
320
  if (flowplayer.conf.is_logged_in != '1') {
321
+ var data = getCookieKey(cookiePositionsKeyName);
322
  if (data && typeof(data) !== 'undefined') {
323
  try {
324
  data = JSON.parse(data);
368
 
369
  playPositions[video_id] = position;
370
 
371
+ if( api.conf.playlist.length > 0 ) {
372
+ if( player_id ) playlistIndexes[ player_id ] = api.video.index; // player_id => playlist_item
373
+ }
374
+
375
  // make a call home every +-30 seconds to make sure a browser crash doesn't affect the position save too much
376
  // if (progressEventsCount++ >= sendPositionsEvery) {
377
  // ... refactor: only store position when we're leaving the page now, not on player progress
460
  // something went wrong, so the next block will continue
461
  }
462
  }
463
+ },
464
 
465
+ restorePlaylistItem = function(e, api) {
466
+ if ( typeof api == 'undefined' || api.conf.playlist.length == 0 ) return;
467
+
468
+ var item_index = -1;
469
+
470
+ if(player_id) {
471
+ if ( flowplayer.conf.is_logged_in != '1') {
472
+ var data = getCookieKey(cookiePlaylistsKeyName);
473
+ if (data && typeof(data) !== 'undefined') {
474
+ try {
475
+ data = JSON.parse(data);
476
+ if (data[player_id]) {
477
+ item_index = data[player_id];
478
+ }
479
+ } catch (e) {
480
+ return;
481
+ }
482
+ }
483
+ } else if( flowplayer.conf.is_logged_in == '1') {
484
+ item_index = api.conf.playlist.length > 0 ? processTempData( tempPlaylistsCookieKeyName, player_id ) : false;
485
+ }
486
+ }
487
+
488
+ if ( item_index >= 0 && !item_changed ) {
489
+ api.play(item_index);
490
+ item_changed = true;
491
+ }
492
+
493
+ };
494
 
495
  if( !enabled ) return;
496
 
497
+ // console.log('Temp cookie', getCookieKey(tempPlaylistsCookieKeyName));
498
+
499
+ if( getCookieKey(tempPlaylistsCookieKeyName) ) {
500
+ $root.removeData('playlist_start'); // prevent conflict with playlist start module
501
+ }
502
+
503
  // stop events
504
  api.bind('finish', removeVideoPosition);
505
 
509
  // to use progress
510
  api.one( 'progress', seekIntoPosition);
511
 
512
+ api.bind('unload', function() {
513
+ item_changed = false;
514
+ api.one('ready', restorePlaylistItem);
515
+ });
516
+
517
+ api.one('ready', restorePlaylistItem);
518
+
519
+ jQuery(".fp-ui", root).on('click', function() {
520
+ restorePlaylistItem();
521
+ });
522
+
523
  /**
524
  * Show the progress on the playlist item thumbnail
525
  *
550
 
551
  var progress = 100 * position/duration;
552
  el.css('width',progress+'%');
553
+ }
554
 
555
  // Check all the playlist items to see if any of them has the temporary "position" or "saw" cookie set
556
  // We do this as the position saving Ajax can no longer be synchronous and block the page reload
615
  }
616
  });
617
 
618
+ // localstorage disabled by admin
619
+ if( typeof(fv_flowplayer_conf.disable_localstorage) != 'undefined' ) {
620
+ localStorageEnabled = false;
621
+ }
622
+
623
  // check whether local storage is enabled
624
  if (localStorageEnabled !== null) {
625
  return localStorageEnabled;
636
  localStorageEnabled = false;
637
  }
638
 
639
+ })(jQuery);
flowplayer/modules/playlist-controlbar.module.js CHANGED
@@ -17,18 +17,21 @@ flowplayer( function(api,root) {
17
  //if( !playlist.hasClass('fp-playlist-season') ) return; // todo: what about mobile? Should we always allow this?
18
 
19
  var playlist_button = jQuery('<strong class="fv-fp-list">Item 1.</strong>'),
 
20
  playlist_menu = jQuery('<div class="fp-menu fv-fp-list-menu"></div>').insertAfter( root.find('.fp-controls') );
21
 
22
- var i =0 , item_index = [];
23
  jQuery(api.conf.playlist).each( function(k,v) {
24
  if(typeof(v.click) == 'undefined' ) {
25
- playlist_menu.append('<a data-index="'+k+'">'+(i+1)+'. '+parse_title(playlist.find('h4').eq(i))+'</a>');
 
 
26
  item_index.push(k);
27
  i++;
28
  }
29
  });
30
 
31
- playlist_button.insertAfter( root.find('.fp-controls .fp-volume') ).on('click', function(e) {
32
  e.preventDefault();
33
  e.stopPropagation();
34
 
@@ -41,8 +44,11 @@ flowplayer( function(api,root) {
41
  root.trigger('click');
42
  api.showMenu(playlist_menu[0]);
43
  }
44
- });
45
-
 
 
 
46
  jQuery('a',playlist_menu).on('click', function() {
47
  if(typeof(api.conf.playlist[jQuery(this).data('index') - 1]) != 'undefined' && typeof(api.conf.playlist[jQuery(this).data('index') - 1].click) != 'undefined' ) { // check if FV Player Pro Video Ad is in front of video - act as if clicked on Ad
48
  api.play(jQuery(this).data('index') - 1);
@@ -56,9 +62,10 @@ flowplayer( function(api,root) {
56
  var thumb = playlist_menu.find('a[data-index='+video.index+']');
57
  thumb.addClass('fp-selected');
58
  var label = fv_flowplayer_translations.playlist_item_no
59
- label = label.replace( /%d/, item_index.indexOf(api.video.index) + 1 );
60
  label = label.replace( /%s/, parse_title( thumb.find('h4') ) );
61
  playlist_button.html(label);
 
62
  });
63
 
64
  function parse_title(el) {
17
  //if( !playlist.hasClass('fp-playlist-season') ) return; // todo: what about mobile? Should we always allow this?
18
 
19
  var playlist_button = jQuery('<strong class="fv-fp-list">Item 1.</strong>'),
20
+ playlist_button_name = jQuery('<strong class="fv-fp-list-name">Item 1.</strong>'),
21
  playlist_menu = jQuery('<div class="fp-menu fv-fp-list-menu"></div>').insertAfter( root.find('.fp-controls') );
22
 
23
+ var i =0 , item_index = [], track_item = [];
24
  jQuery(api.conf.playlist).each( function(k,v) {
25
  if(typeof(v.click) == 'undefined' ) {
26
+ var title = parse_title(playlist.find('h4').eq(i));
27
+ playlist_menu.append('<a data-index="'+k+'">'+(i+1)+'. '+title+'</a>');
28
+ track_item[k] = title;
29
  item_index.push(k);
30
  i++;
31
  }
32
  });
33
 
34
+ function playlist_button_click(e) {
35
  e.preventDefault();
36
  e.stopPropagation();
37
 
44
  root.trigger('click');
45
  api.showMenu(playlist_menu[0]);
46
  }
47
+ }
48
+
49
+ playlist_button.insertAfter( root.find('.fp-controls .fp-volume') ).on('click', playlist_button_click);
50
+ playlist_button_name.insertAfter(playlist_button).on('click', playlist_button_click);
51
+
52
  jQuery('a',playlist_menu).on('click', function() {
53
  if(typeof(api.conf.playlist[jQuery(this).data('index') - 1]) != 'undefined' && typeof(api.conf.playlist[jQuery(this).data('index') - 1].click) != 'undefined' ) { // check if FV Player Pro Video Ad is in front of video - act as if clicked on Ad
54
  api.play(jQuery(this).data('index') - 1);
62
  var thumb = playlist_menu.find('a[data-index='+video.index+']');
63
  thumb.addClass('fp-selected');
64
  var label = fv_flowplayer_translations.playlist_item_no
65
+ label = label.replace( /%d/, item_index.indexOf(video.index) + 1 );
66
  label = label.replace( /%s/, parse_title( thumb.find('h4') ) );
67
  playlist_button.html(label);
68
+ playlist_button_name.html( (item_index.indexOf(video.index) + 1) + '. ' + track_item[video.index] );
69
  });
70
 
71
  function parse_title(el) {
flowplayer/modules/playlist-start-position.module.js CHANGED
@@ -6,8 +6,8 @@ flowplayer( function(api,root) {
6
 
7
  if( typeof(start_index) == 'undefined' ) return;
8
 
9
- function start_position_changer() {
10
- if ($root.data('position_changed') !== 1 && api.conf.playlist.length) {
11
  start_index--; // the index should start from 0
12
  api.play(start_index);
13
  $root.data('position_changed', 1);
@@ -18,7 +18,6 @@ flowplayer( function(api,root) {
18
  start_index = $root.data('playlist_start');
19
  $root.removeData('position_changed');
20
  api.one('ready', start_position_changer);
21
- api.video.index = 0;
22
  });
23
 
24
  api.one('ready', start_position_changer);
@@ -28,4 +27,4 @@ flowplayer( function(api,root) {
28
  $root.data('position_changed', 1);
29
  });
30
 
31
- });
6
 
7
  if( typeof(start_index) == 'undefined' ) return;
8
 
9
+ function start_position_changer() {
10
+ if ($root.data('position_changed') !== 1 && api.conf.playlist.length) {
11
  start_index--; // the index should start from 0
12
  api.play(start_index);
13
  $root.data('position_changed', 1);
18
  start_index = $root.data('playlist_start');
19
  $root.removeData('position_changed');
20
  api.one('ready', start_position_changer);
 
21
  });
22
 
23
  api.one('ready', start_position_changer);
27
  $root.data('position_changed', 1);
28
  });
29
 
30
+ });
flowplayer/modules/sharing.module.js CHANGED
@@ -63,6 +63,17 @@ flowplayer( function(api,root) {
63
  });
64
  }
65
  }
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  api.bind("pause resume finish unload ready", function(e,api) {
68
  root.addClass('no-brand');
@@ -72,7 +83,7 @@ flowplayer( function(api,root) {
72
  root.find('.fp-fullscreen').clone().appendTo( root.find('.fp-controls') );
73
  });
74
 
75
- api.bind("ready", function (e, api, video) {
76
  setTimeout( function () {
77
  jQuery('.fvp-share-bar',root).show();
78
 
63
  });
64
  }
65
  }
66
+
67
+ // show notice in editor
68
+ if( typeof fv_player_editor_conf != 'undefined') {
69
+ root.on('click','.fvp-sharing > li', function(e) {
70
+ e.preventDefault();
71
+
72
+ fv_player_notice( root, fv_player_editor_translations.link_notice, 2000 );
73
+
74
+ return false;
75
+ });
76
+ }
77
 
78
  api.bind("pause resume finish unload ready", function(e,api) {
79
  root.addClass('no-brand');
83
  root.find('.fp-fullscreen').clone().appendTo( root.find('.fp-controls') );
84
  });
85
 
86
+ api.on("ready", function (e, api, video) {
87
  setTimeout( function () {
88
  jQuery('.fvp-share-bar',root).show();
89
 
flowplayer/modules/speed-restore.module.js CHANGED
@@ -2,6 +2,12 @@
2
  * Video speed localstorage
3
  */
4
  flowplayer( function(api,root) {
 
 
 
 
 
 
5
  api.on('speed', function(ev, _a, rate) {
6
  try {
7
  window.localStorage.fv_player_speed = rate;
2
  * Video speed localstorage
3
  */
4
  flowplayer( function(api,root) {
5
+
6
+ // localstorage disabled by admin
7
+ if( typeof(fv_flowplayer_conf.disable_localstorage) != 'undefined' ) {
8
+ return;
9
+ }
10
+
11
  api.on('speed', function(ev, _a, rate) {
12
  try {
13
  window.localStorage.fv_player_speed = rate;
flowplayer/modules/subtitle-restore.module.js CHANGED
@@ -4,6 +4,11 @@
4
  flowplayer( function(api,root) {
5
  root = jQuery(root);
6
 
 
 
 
 
 
7
  var ls = window.localStorage;
8
 
9
  // restore subtitle on ready event
4
  flowplayer( function(api,root) {
5
  root = jQuery(root);
6
 
7
+ // localstorage disabled by admin
8
+ if( typeof(fv_flowplayer_conf.disable_localstorage) != 'undefined' ) {
9
+ return;
10
+ }
11
+
12
  var ls = window.localStorage;
13
 
14
  // restore subtitle on ready event
flowplayer/modules/volume.module.js CHANGED
@@ -10,15 +10,21 @@
10
  flowplayer(function(api, root) {
11
  root = jQuery(root);
12
  var bean = flowplayer.bean;
13
- var restore = -1;
14
 
15
- // Restore volume on click
16
- root.on('click','.fp-volumebtn', function(e) {
17
- if(api.volumeLevel == 0 && restore != -1) {
18
- api.volume(restore);
19
- return false;
 
 
 
 
 
 
20
  }
21
- })
22
 
23
  // Click into volume bar and start dragging it down and drag it to very 0, it would remember the initial volume - the one which was there on mousedown
24
  // Other case is click into the volume bar and drag it from 1 to about 0.5. So 0.5 is remembered on mouseup, then drag it to 0. So clicking the mute icon would restore to 0.5
@@ -29,13 +35,6 @@ flowplayer(function(api, root) {
29
  }
30
  })
31
 
32
- // When muting with the button forget about the volume to restore
33
- // As otherwise the root.on('click','.fp-volumebtn', ... ) handler above would restore the volume
34
- root.on('mousedown touchstart','.fp-volumebtn', function(e) {
35
- if( api.volumeLevel > 0 ) {
36
- restore = -1;
37
- }
38
- });
39
 
40
  // Mute
41
  api.on('volume', function(e,api) {
@@ -50,10 +49,10 @@ flowplayer(function(api, root) {
50
  // If video starts muted, show a notice
51
  var deal_with_muted_start = false;
52
 
53
- api.on('ready', function(e,api) {
 
54
  if( root.hasClass('is-audio') ) return;
55
 
56
- // Remember to check this for each video that starts playing
57
  deal_with_muted_start = true;
58
  });
59
 
@@ -76,7 +75,7 @@ flowplayer(function(api, root) {
76
  return;
77
  }
78
 
79
- var mute_notice = jQuery('<div class="fp-message fp-message-muted fp-shown"><span class="fp-icon fp-volumebtn-notice"></span> '+fv_flowplayer_translations.click_to_unmute+'</div>');
80
 
81
  // We need touchstart for mobile, otherwise click would only show te UI
82
  mute_notice.on( 'click touchstart', function() {
@@ -86,6 +85,9 @@ flowplayer(function(api, root) {
86
 
87
  root.find('.fp-ui').append( mute_notice );
88
  root.addClass('has-fp-message-muted');
 
 
 
89
  }
90
  }
91
  } );
10
  flowplayer(function(api, root) {
11
  root = jQuery(root);
12
  var bean = flowplayer.bean;
13
+ var restore = flowplayer.conf.default_volume;
14
 
15
+ // Restore volume on click on the speaker icon
16
+ root.on('mousedown touchstart','.fp-volumebtn', function(e) {
17
+ var volumebtn = jQuery(this);
18
+
19
+ // Only restore if it's muted, we use mousedown event to be able to check this
20
+ if( api.volumeLevel == 0 ) {
21
+ // The click event which follows after mousedown will be affected
22
+ volumebtn.one( 'click', function() {
23
+ api.volume( restore );
24
+ return false;
25
+ });
26
  }
27
+ });
28
 
29
  // Click into volume bar and start dragging it down and drag it to very 0, it would remember the initial volume - the one which was there on mousedown
30
  // Other case is click into the volume bar and drag it from 1 to about 0.5. So 0.5 is remembered on mouseup, then drag it to 0. So clicking the mute icon would restore to 0.5
35
  }
36
  })
37
 
 
 
 
 
 
 
 
38
 
39
  // Mute
40
  api.on('volume', function(e,api) {
49
  // If video starts muted, show a notice
50
  var deal_with_muted_start = false;
51
 
52
+ // We only set this on the first ready event - meaning it only show for first item in playlist
53
+ api.one('ready', function(e,api) {
54
  if( root.hasClass('is-audio') ) return;
55
 
 
56
  deal_with_muted_start = true;
57
  });
58
 
75
  return;
76
  }
77
 
78
+ var mute_notice = jQuery('<div class="fp-message fp-message-muted"><span class="fp-icon fp-volumebtn-notice"></span> '+fv_flowplayer_translations.click_to_unmute+'</div>');
79
 
80
  // We need touchstart for mobile, otherwise click would only show te UI
81
  mute_notice.on( 'click touchstart', function() {
85
 
86
  root.find('.fp-ui').append( mute_notice );
87
  root.addClass('has-fp-message-muted');
88
+
89
+ // Remove the notice after a while
90
+ setTimeout( remove_volume_notice, 5000 );
91
  }
92
  }
93
  } );
includes/class.bunnycdn.rewrite.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if( !class_exists('FV_Player_BunnyCDN_Rewrite') ) {
4
+
5
+ class FV_Player_BunnyCDN_Rewrite extends BunnyCDNFilter {
6
+ public function rewrite_url( $url ) {
7
+ $directoriesRegex = implode('|', $this->directories);
8
+ $regex = '~(?:'. quotemeta($this->baseUrl) .')?/((?:'.$directoriesRegex.').*)~'; // custom regex to match url
9
+ return preg_replace_callback($regex, array(&$this, "rewriteUrl"), $url);
10
+ }
11
+ }
12
+
13
+ }
includes/class.fv-player-wizard-step-base.php CHANGED
@@ -2,7 +2,10 @@
2
 
3
  abstract class FV_Player_Wizard_Step_Base_Class {
4
 
5
- var $buttons = array(
 
 
 
6
  'next' => array(
7
  'primary' => false,
8
  'value' => 'Next',
@@ -12,8 +15,12 @@ abstract class FV_Player_Wizard_Step_Base_Class {
12
  function buttons() {
13
  ?>
14
  <tr>
15
- <td></td>
16
- <td>
 
 
 
 
17
  <?php $this->get_buttons( $this->buttons ); ?>
18
  </td>
19
  </tr>
@@ -23,8 +30,8 @@ abstract class FV_Player_Wizard_Step_Base_Class {
23
  function display() {
24
  global $fv_fp;
25
  $fv_fp->_get_input_text( array(
26
- 'key' => self::$key,
27
- 'name' => self::$name,
28
  'class' => 'regular-text code'
29
  ) );
30
  }
2
 
3
  abstract class FV_Player_Wizard_Step_Base_Class {
4
 
5
+ protected
6
+ $buttons_across_2_columns = false,
7
+
8
+ $buttons = array(
9
  'next' => array(
10
  'primary' => false,
11
  'value' => 'Next',
15
  function buttons() {
16
  ?>
17
  <tr>
18
+ <?php
19
+ if ( !$this->buttons_across_2_columns ) {
20
+ ?><td></td>
21
+ <?php
22
+ }
23
+ ?><td<?php echo ( $this->buttons_across_2_columns ? ' colspan="2"' : '' ); ?>>
24
  <?php $this->get_buttons( $this->buttons ); ?>
25
  </td>
26
  </tr>
30
  function display() {
31
  global $fv_fp;
32
  $fv_fp->_get_input_text( array(
33
+ 'key' => $this->key,
34
+ 'name' => $this->name,
35
  'class' => 'regular-text code'
36
  ) );
37
  }
includes/fp-api-private.php CHANGED
@@ -89,7 +89,7 @@ class FV_Wordpress_Flowplayer_Plugin_Private
89
  add_action( 'update_option__transient_update_plugins', array( $this, 'CheckPluginUpdateOld' ) );
90
  add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
91
  }
92
- }
93
  }
94
 
95
  function object_cache_disable($value=null){
@@ -477,8 +477,8 @@ $this->strPrivateAPI - also
477
 
478
  $cookie[$_POST['key']] = !empty($_POST['value']) ? $_POST['value'] : true;
479
 
480
- $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );
481
- setcookie( $this->class_name.'_store_answer', json_encode($cookie), time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN, $secure );
482
  }
483
 
484
 
@@ -666,6 +666,10 @@ $this->strPrivateAPI - also
666
  jQuery('#wp-pointer-0').remove(); // there must only be a single pointer at once. Or perhaps it removes them all, but the ones which were not dismissed by Ajax by storing the option will turn up again?
667
  });
668
  }
 
 
 
 
669
  //]]>
670
  </script>
671
  <?php
@@ -699,20 +703,30 @@ $this->strPrivateAPI - also
699
  } else {
700
  $html .= '<p>'.$content.'</p>';
701
  }
702
-
703
  ?>
704
  <script type="text/javascript">
705
  //<![CDATA[
706
  (function ($) {
 
 
 
 
 
 
 
 
707
  var pointer_options = <?php echo json_encode( array( 'pointerClass' => $key, 'content' => $html, 'position' => $position ) ); ?>,
708
- setup = function () {
709
- $('<?php echo $id; ?>').pointer(pointer_options).pointer('open');
710
- var buttons = $('.<?php echo $key; ?> .wp-pointer-buttons').html('');
711
- buttons.append( $('<a style="margin-left:5px" class="button-primary">' + '<?php echo addslashes($button1); ?>' + '</a>').bind('click.pointer', function () { <?php echo $function1; ?>; t.element.pointer('close'); }) );
712
- <?php if ( $button2 ) { ?>
713
- buttons.append( $('<a class="button-secondary">' + '<?php echo addslashes($button2); ?>' + '</a>').bind('click.pointer', function () { <?php echo $function2; ?> }) );
714
- <?php } ?>
715
- };
 
 
716
 
717
  if(pointer_options.position && pointer_options.position.defer_loading)
718
  $(window).bind('load.wp-pointers', setup);
@@ -724,7 +738,7 @@ $this->strPrivateAPI - also
724
  <?php
725
  }
726
  }
727
-
728
 
729
  function check_domain_license() {
730
  if( $_POST['slug'] != $this->strPluginSlug ) {
89
  add_action( 'update_option__transient_update_plugins', array( $this, 'CheckPluginUpdateOld' ) );
90
  add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
91
  }
92
+ }
93
  }
94
 
95
  function object_cache_disable($value=null){
477
 
478
  $cookie[$_POST['key']] = !empty($_POST['value']) ? $_POST['value'] : true;
479
 
480
+ $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );
481
+ setcookie( $this->class_name.'_store_answer', json_encode($cookie), time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN, $secure );
482
  }
483
 
484
 
666
  jQuery('#wp-pointer-0').remove(); // there must only be a single pointer at once. Or perhaps it removes them all, but the ones which were not dismissed by Ajax by storing the option will turn up again?
667
  });
668
  }
669
+
670
+ /*! js-cookie v3.0.1 | MIT */
671
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,(function(){"use strict";function e(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)e[o]=n[o]}return e}return function t(n,o){function r(t,r,i){if("undefined"!=typeof document){"number"==typeof(i=e({},o,i)).expires&&(i.expires=new Date(Date.now()+864e5*i.expires)),i.expires&&(i.expires=i.expires.toUTCString()),t=encodeURIComponent(t).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var c="";for(var u in i)i[u]&&(c+="; "+u,!0!==i[u]&&(c+="="+i[u].split(";")[0]));return document.cookie=t+"="+n.write(r,t)+c}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var t=document.cookie?document.cookie.split("; "):[],o={},r=0;r<t.length;r++){var i=t[r].split("="),c=i.slice(1).join("=");try{var u=decodeURIComponent(i[0]);if(o[u]=n.read(c,u),e===u)break}catch(e){}}return e?o[e]:o}},remove:function(t,n){r(t,"",e({},n,{expires:-1}))},withAttributes:function(n){return t(this.converter,e({},this.attributes,n))},withConverter:function(n){return t(e({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(o)},converter:{value:Object.freeze(n)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}));
672
+
673
  //]]>
674
  </script>
675
  <?php
703
  } else {
704
  $html .= '<p>'.$content.'</p>';
705
  }
706
+
707
  ?>
708
  <script type="text/javascript">
709
  //<![CDATA[
710
  (function ($) {
711
+ store_cookie_js = function(value , key) {
712
+ var cookie_name = '<?php echo $this->class_name.'_store_answer'; ?>';
713
+ var pointer_cookies = JSON.parse( Cookies.get(cookie_name) );
714
+ pointer_cookies[key] = value;
715
+ Cookies.set(cookie_name, JSON.stringify(pointer_cookies) , { secure: location.protocol == 'https:', expires: 365 } )
716
+ jQuery('#wp-pointer-0').remove();
717
+ }
718
+
719
  var pointer_options = <?php echo json_encode( array( 'pointerClass' => $key, 'content' => $html, 'position' => $position ) ); ?>,
720
+ key = '<?php echo $key; ?>',
721
+
722
+ setup = function () {
723
+ $('<?php echo $id; ?>').pointer(pointer_options).pointer('open');
724
+ var buttons = $('.<?php echo $key; ?> .wp-pointer-buttons').html('');
725
+ buttons.append( $('<a style="margin-left:5px" class="button-primary">' + '<?php echo addslashes($button1); ?>' + '</a>').on('click.pointer', function () { <?php echo $function1; ?>; store_cookie_js('true' , key); }));
726
+ <?php if ( $button2 ) { ?>
727
+ buttons.append( $('<a class="button-secondary">' + '<?php echo addslashes($button2); ?>' + '</a>').on('click.pointer', function () { <?php echo $function2; ?>; store_cookie_js('false', key); }));
728
+ <?php } ?>
729
+ };
730
 
731
  if(pointer_options.position && pointer_options.position.defer_loading)
732
  $(window).bind('load.wp-pointers', setup);
738
  <?php
739
  }
740
  }
741
+
742
 
743
  function check_domain_license() {
744
  if( $_POST['slug'] != $this->strPluginSlug ) {
includes/fv-player-wizard-base.js CHANGED
@@ -6,7 +6,7 @@ jQuery( function($) {
6
 
7
  set_current_step_wrap();
8
 
9
- $(document).on( 'click', '[data-fv-player-wizard-next]', function(e) {
10
  var button_next = $(this),
11
  indicator = current_step_wrap.find('[data-fv-player-wizard-indicator]');
12
 
@@ -15,7 +15,7 @@ jQuery( function($) {
15
  var has_required_fields = true
16
  get_step_fields().each( function() {
17
  var input = $(this);
18
- if( !input.val() ) {
19
  add_field_error('This field is required',input);
20
  has_required_fields = false;
21
  }
6
 
7
  set_current_step_wrap();
8
 
9
+ $(document).on( 'click', '[data-fv-player-wizard-next]', function() {
10
  var button_next = $(this),
11
  indicator = current_step_wrap.find('[data-fv-player-wizard-indicator]');
12
 
15
  var has_required_fields = true
16
  get_step_fields().each( function() {
17
  var input = $(this);
18
+ if( !input.val() && !input.data('optional') ) {
19
  add_field_error('This field is required',input);
20
  has_required_fields = false;
21
  }
js/editor-screenshots.js CHANGED
@@ -163,7 +163,7 @@
163
  function show_error() {
164
  spinner.remove();
165
  button.prop("disabled",false);
166
- message.html('<div class="error"><p>Cannot obtain video screenshot, please make sure the video is served with <a href="https://foliovision.com/player/video-hosting/hls#hls-js">CORS headers</a>.</p></div>');
167
  fv_wp_flowplayer_dialog_resize();
168
  }
169
 
163
  function show_error() {
164
  spinner.remove();
165
  button.prop("disabled",false);
166
+ message.html(fv_player_editor_translations.screenshot_cors_error);
167
  fv_wp_flowplayer_dialog_resize();
168
  }
169
 
js/fancybox.js CHANGED
@@ -1,16 +1,16 @@
1
  // ==================================================
2
- // fancyBox v3.4.1
3
  //
4
  // Licensed GPLv3 for open source use
5
  // or fancyBox Commercial License for commercial use
6
  //
7
  // http://fancyapps.com/fancybox/
8
- // Copyright 2018 fancyApps
9
  //
10
  // ==================================================
11
- !function(t,e,n,o){"use strict";function i(t,e){var o,i,a,s=[],r=0;t&&t.isDefaultPrevented()||(t.preventDefault(),e=e||{},t&&t.data&&(e=p(t.data.options,e)),o=e.$target||n(t.currentTarget).trigger("blur"),a=n.fancybox.getInstance(),a&&a.$trigger&&a.$trigger.is(o)||(e.selector?s=n(e.selector):(i=o.attr("data-fancybox")||"",i?(s=t.data?t.data.items:[],s=s.length?s.filter('[data-fancybox="'+i+'"]'):n('[data-fancybox="'+i+'"]')):s=[o]),r=n(s).index(o),r<0&&(r=0),a=n.fancybox.open(s,e,r),a.$trigger=o))}if(t.console=t.console||{info:function(t){}},n){if(n.fn.fancybox)return void console.info("fancyBox already initialized");var a={closeExisting:!1,loop:!1,gutter:50,keyboard:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","thumbs","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{data:{fancybox:!0}}},iframe:{tpl:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true" src=""></iframe>',preload:!0,css:{},attr:{scrolling:"auto"}},video:{tpl:'<video class="fancybox-video" controls controlsList="nodownload"><source src="{{src}}" type="{{format}}" />Your browser doesn\'t support HTML5 video</video>',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'<div class="fancybox-container" role="dialog" tabindex="-1"><div class="fancybox-bg"></div><div class="fancybox-inner"><div class="fancybox-infobar"><span data-fancybox-index></span>&nbsp;/&nbsp;<span data-fancybox-count></span></div><div class="fancybox-toolbar">{{buttons}}</div><div class="fancybox-navigation">{{arrows}}</div><div class="fancybox-stage"></div><div class="fancybox-caption"></div></div></div>',spinnerTpl:'<div class="fancybox-loading"></div>',errorTpl:'<div class="fancybox-error"><p>{{ERROR}}</p></div>',btnTpl:{download:'<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.62 17.09V19H5.38v-1.91zm-2.97-6.96L17 11.45l-5 4.87-5-4.87 1.36-1.32 2.68 2.64V5h1.92v7.77z"/></svg></a>',zoom:'<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.7 17.3l-3-3a5.9 5.9 0 0 0-.6-7.6 5.9 5.9 0 0 0-8.4 0 5.9 5.9 0 0 0 0 8.4 5.9 5.9 0 0 0 7.7.7l3 3a1 1 0 0 0 1.3 0c.4-.5.4-1 0-1.5zM8.1 13.8a4 4 0 0 1 0-5.7 4 4 0 0 1 5.7 0 4 4 0 0 1 0 5.7 4 4 0 0 1-5.7 0z"/></svg></button>',close:'<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10.6L6.6 5.2 5.2 6.6l5.4 5.4-5.4 5.4 1.4 1.4 5.4-5.4 5.4 5.4 1.4-1.4-5.4-5.4 5.4-5.4-1.4-1.4-5.4 5.4z"/></svg></button>',arrowLeft:'<button data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}"><div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.28 15.7l-1.34 1.37L5 12l4.94-5.07 1.34 1.38-2.68 2.72H19v1.94H8.6z"/></svg></div></button>',arrowRight:'<button data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}"><div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 12.97l-2.68 2.72 1.34 1.38L19 12l-4.94-5.07-1.34 1.38 2.68 2.72H5v1.94z"/></svg></div></button>',smallBtn:'<button type="button" data-fancybox-close class="fancybox-button fancybox-close-small" title="{{CLOSE}}"><svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 24 24"><path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"/></svg></button>'},parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded. <br/> Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schliessen",NEXT:"Weiter",PREV:"Zurück",ERROR:"Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es später nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Maßstab"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){var t,n=e.createElement("fakeelement"),i={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in i)if(n.style[t]!==o)return i[t];return"transitionend"}(),f=function(t){return t&&t.length&&t[0].offsetHeight},p=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){n.isArray(e)&&(o[t]=e)}),o},h=function(t,e,o){var i=this;i.opts=p({index:o},n.fancybox.defaults),n.isPlainObject(e)&&(i.opts=p(i.opts,e)),n.fancybox.isMobile&&(i.opts=p(i.opts,i.opts.mobile)),i.id=i.opts.id||++c,i.currIndex=parseInt(i.opts.index,10)||0,i.prevIndex=null,i.prevPos=null,i.currPos=0,i.firstRun=!0,i.group=[],i.slides={},i.addContent(t),i.group.length&&i.init()};n.extend(h.prototype,{init:function(){var i,a,s,r=this,c=r.group[r.currIndex],l=c.opts,d=n.fancybox.scrollbarWidth;l.closeExisting&&n.fancybox.close(!0),n("body").addClass("fancybox-active"),!n.fancybox.getInstance()&&l.hideScrollbar!==!1&&!n.fancybox.isMobile&&e.body.scrollHeight>t.innerHeight&&(d===o&&(i=n('<div style="width:100px;height:100px;overflow:scroll;" />').appendTo("body"),d=n.fancybox.scrollbarWidth=i[0].offsetWidth-i[0].clientWidth,i.remove()),n("head").append('<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar { margin-right: '+d+"px; }</style>"),n("body").addClass("compensate-for-scrollbar")),s="",n.each(l.buttons,function(t,e){s+=l.btnTpl[e]||""}),a=n(r.translate(r,l.baseTpl.replace("{{buttons}}",s).replace("{{arrows}}",l.btnTpl.arrowLeft+l.btnTpl.arrowRight))).attr("id","fancybox-container-"+r.id).addClass(l.baseClass).data("FancyBox",r).appendTo(l.parentEl),r.$refs={container:a},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){r.$refs[t]=a.find(".fancybox-"+t)}),r.trigger("onInit"),r.activate(),r.jumpTo(r.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang];return e.replace(/\{\{(\w+)\}\}/g,function(t,e){var i=n[e];return i===o?t:i})},addContent:function(t){var e,i=this,a=n.makeArray(t);n.each(a,function(t,e){var a,s,r,c,l,d={},u={};n.isPlainObject(e)?(d=e,u=e.opts||e):"object"===n.type(e)&&n(e).length?(a=n(e),u=a.data()||{},u=n.extend(!0,{},u,u.options),u.$orig=a,d.src=i.opts.src||u.src||a.attr("href"),d.type||d.src||(d.type="inline",d.src=e)):d={type:"html",src:e+""},d.opts=n.extend(!0,{},i.opts,u),n.isArray(u.buttons)&&(d.opts.buttons=u.buttons),n.fancybox.isMobile&&d.opts.mobile&&(d.opts=p(d.opts,d.opts.mobile)),s=d.type||d.opts.type,c=d.src||"",!s&&c&&((r=c.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))?(s="video",d.opts.video.format||(d.opts.video.format="video/"+("ogv"===r[1]?"ogg":r[1]))):c.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?s="image":c.match(/\.(pdf)((\?|#).*)?$/i)?s="iframe":"#"===c.charAt(0)&&(s="inline")),s?d.type=s:i.trigger("objectNeedsType",d),d.contentType||(d.contentType=n.inArray(d.type,["html","inline","ajax"])>-1?"html":d.type),d.index=i.group.length,"auto"==d.opts.smallBtn&&(d.opts.smallBtn=n.inArray(d.type,["html","inline","ajax"])>-1),"auto"===d.opts.toolbar&&(d.opts.toolbar=!d.opts.smallBtn),d.opts.$trigger&&d.index===i.opts.index&&(d.opts.$thumb=d.opts.$trigger.find("img:first"),d.opts.$thumb.length&&(d.opts.$orig=d.opts.$trigger)),d.opts.$thumb&&d.opts.$thumb.length||!d.opts.$orig||(d.opts.$thumb=d.opts.$orig.find("img:first")),"function"===n.type(d.opts.caption)&&(d.opts.caption=d.opts.caption.apply(e,[i,d])),"function"===n.type(i.opts.caption)&&(d.opts.caption=i.opts.caption.apply(e,[i,d])),d.opts.caption instanceof n||(d.opts.caption=d.opts.caption===o?"":d.opts.caption+""),"ajax"===d.type&&(l=c.split(/\s+/,2),l.length>1&&(d.src=l.shift(),d.opts.filter=l.shift())),d.opts.modal&&(d.opts=n.extend(!0,d.opts,{infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),i.group.push(d)}),Object.keys(i.slides).length&&(i.updateControls(),e=i.Thumbs,e&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var e=this;e.removeEvents(),e.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),e.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),e.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),e.next()}).on("click.fb","[data-fancybox-zoom]",function(t){e[e.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?d(function(){e.update()}):(e.current&&"iframe"===e.current.type&&e.$refs.stage.hide(),setTimeout(function(){e.$refs.stage.show(),e.update()},n.fancybox.isMobile?600:250))}),r.on("keydown.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null,i=o.current,a=t.keyCode||t.which;if(9==a)return void(i.opts.trapFocus&&e.focus(t));if(!(!i.opts.keyboard||t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input")||n(t.target).is("textarea")))return 8===a||27===a?(t.preventDefault(),void e.close(t)):37===a||38===a?(t.preventDefault(),void e.previous()):39===a||40===a?(t.preventDefault(),void e.next()):void e.trigger("afterKeydown",t,a)}),e.group[e.currIndex].opts.idleTime&&(e.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){e.idleSecondsCounter=0,e.isIdle&&e.showControls(),e.isIdle=!1}),e.idleInterval=t.setInterval(function(){e.idleSecondsCounter++,e.idleSecondsCounter>=e.group[e.currIndex].opts.idleTime&&!e.isDragging&&(e.isIdle=!0,e.idleSecondsCounter=0,e.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var i,a,s,r,c,l,d,u=this,f=u.group.length;if(!(u.isDragging||u.isClosing||u.isAnimating&&u.firstRun)){if(t=parseInt(t,10),s=u.current?u.current.opts.loop:u.opts.loop,!s&&(t<0||t>=f))return!1;if(i=u.firstRun=!Object.keys(u.slides).length,!(f<2&&!i&&u.isDragging)){if(c=u.current,u.prevIndex=u.currIndex,u.prevPos=u.currPos,r=u.createSlide(t),f>1&&((s||r.index<f-1)&&u.createSlide(t+1),(s||r.index>0)&&u.createSlide(t-1)),u.current=r,u.currIndex=r.index,u.currPos=r.pos,u.trigger("beforeShow",i),u.updateControls(),a=u.isMoved(r),r.forcedDuration=o,n.isNumeric(e)?r.forcedDuration=e:e=r.opts[i?"animationDuration":"transitionDuration"],e=parseInt(e,10),i)return r.opts.animationEffect&&e&&u.$refs.container.css("transition-duration",e+"ms"),u.$refs.container.addClass("fancybox-is-open"),r.$slide.addClass("fancybox-slide--previous"),u.loadSlide(r),r.$slide.removeClass("fancybox-slide--previous").addClass("fancybox-slide--current"),u.preload("image"),void u.$refs.container.trigger("focus");n.each(u.slides,function(t,e){n.fancybox.stop(e.$slide,!0),e.$slide.removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")})}),r.$slide.removeClass("fancybox-slide--next fancybox-slide--previous").addClass("fancybox-slide--current"),a?(l=Math.round(r.$slide.width()),n.each(u.slides,function(t,o){var i=o.pos-r.pos;n.fancybox.animate(o.$slide,{top:0,left:i*l+i*o.opts.gutter},e,function(){o.$slide.removeAttr("style").removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===u.currPos&&u.complete()})})):u.$refs.stage.children().removeAttr("style"),r.isLoaded?u.revealContent(r):u.loadSlide(r),u.preload("image"),c.pos!==r.pos&&(d="fancybox-slide--"+(c.pos>r.pos?"next":"previous"),c.$slide.removeClass("fancybox-slide--complete fancybox-slide--current fancybox-slide--next fancybox-slide--previous"),c.isComplete=!1,e&&(a||r.opts.transitionEffect)&&(a?c.$slide.addClass(d):(d="fancybox-animated "+d+" fancybox-fx-"+r.opts.transitionEffect,n.fancybox.animate(c.$slide,d,e,null,!1))))}}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('<div class="fancybox-slide"></div>').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]},scaleToActual:function(t,e,i){var a,s,r,c,l,d=this,u=d.current,f=u.$content,p=n.fancybox.getTranslate(u.$slide).width,h=n.fancybox.getTranslate(u.$slide).height,g=u.width,b=u.height;!d.isAnimating&&f&&"image"==u.type&&u.isLoaded&&!u.hasError&&(n.fancybox.stop(f),d.isAnimating=!0,t=t===o?.5*p:t,e=e===o?.5*h:e,a=n.fancybox.getTranslate(f),a.top-=n.fancybox.getTranslate(u.$slide).top,a.left-=n.fancybox.getTranslate(u.$slide).left,c=g/a.width,l=b/a.height,s=.5*p-.5*g,r=.5*h-.5*b,g>p&&(s=a.left*c-(t*c-t),s>0&&(s=0),s<p-g&&(s=p-g)),b>h&&(r=a.top*l-(e*l-e),r>0&&(r=0),r<h-b&&(r=h-b)),d.updateCursor(g,b),n.fancybox.animate(f,{top:r,left:s,scaleX:c,scaleY:l},i||330,function(){d.isAnimating=!1}),d.SlideShow&&d.SlideShow.isActive&&d.SlideShow.stop())},scaleToFit:function(t){var e,o=this,i=o.current,a=i.$content;!o.isAnimating&&a&&"image"==i.type&&i.isLoaded&&!i.hasError&&(n.fancybox.stop(a),o.isAnimating=!0,e=o.getFitPos(i),o.updateCursor(e.width,e.height),n.fancybox.animate(a,{top:e.top,left:e.left,scaleX:e.width/a.width(),scaleY:e.height/a.height()},t||330,function(){o.isAnimating=!1}))},getFitPos:function(t){var e,o,i,a,s=this,r=t.$content,c=t.$slide,l=t.width||t.opts.width,d=t.height||t.opts.height,u={};return!!(t.isLoaded&&r&&r.length)&&(e=n.fancybox.getTranslate(s.$refs.stage).width,o=n.fancybox.getTranslate(s.$refs.stage).height,e-=parseFloat(c.css("paddingLeft"))+parseFloat(c.css("paddingRight"))+parseFloat(r.css("marginLeft"))+parseFloat(r.css("marginRight")),o-=parseFloat(c.css("paddingTop"))+parseFloat(c.css("paddingBottom"))+parseFloat(r.css("marginTop"))+parseFloat(r.css("marginBottom")),l&&d||(l=e,d=o),i=Math.min(1,e/l,o/d),l=Math.floor(i*l),d=Math.floor(i*d),"image"===t.type?(u.top=Math.floor(.5*(o-d))+parseFloat(c.css("paddingTop")),u.left=Math.floor(.5*(e-l))+parseFloat(c.css("paddingLeft"))):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?l/d:t.opts.ratio||16/9,d>l/a?d=l/a:l>d*a&&(l=d*a)),u.width=l,u.height=d,u)},update:function(){var t=this;n.each(t.slides,function(e,n){t.updateSlide(n)})},updateSlide:function(t){var e=this,o=t&&t.$content,i=t.width||t.opts.width,a=t.height||t.opts.height,s=t.$slide;o&&(i||a||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(o),n.fancybox.setTranslate(o,e.getFitPos(t)),t.pos===e.currPos&&(e.isAnimating=!1,e.updateCursor())),s.length&&(s.trigger("refresh"),e.$refs.toolbar.toggleClass("compensate-for-scrollbar",s.get(0).scrollHeight>s.get(0).clientHeight)),e.trigger("onUpdate",t)},centerSlide:function(t,e){var i,a,s=this;s.current&&(i=Math.round(t.$slide.width()),a=t.pos-s.current.pos,n.fancybox.animate(t.$slide,{top:0,left:a*i+a*t.opts.gutter,opacity:1},e===o?0:e,null,!1))},isMoved:function(t){var e=t||this.current,o=n.fancybox.getTranslate(e.$slide);return(0!==o.left||0!==o.top)&&!e.$slide.hasClass("fancybox-animated")},updateCursor:function(t,e){var o,i=this,a=i.current,s=i.$refs.container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan");a&&!i.isClosing&&(o=i.isZoomable(),s.toggleClass("fancybox-is-zoomable",o),n("[data-fancybox-zoom]").prop("disabled",!o),i.canPan(t,e)?s.addClass("fancybox-can-pan"):o&&("zoom"===a.opts.clickContent||n.isFunction(a.opts.clickContent)&&"zoom"==a.opts.clickContent(a))?s.addClass("fancybox-can-zoomIn"):a.opts.touch&&(a.opts.touch.vertical||i.group.length>1)&&"video"!==a.contentType&&s.addClass("fancybox-can-swipe"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if(t=e.getFitPos(n),n.width>t.width||n.height>t.height)return!0}return!1},isScaledDown:function(t,e){var i=this,a=!1,s=i.current,r=s.$content;return t!==o&&e!==o?a=t<s.width&&e<s.height:r&&(a=n.fancybox.getTranslate(r),a=a.width<s.width&&a.height<s.height),a},canPan:function(t,e){var i,a,s=this,r=!1,c=s.current;return"image"===c.type&&(i=c.$content)&&!c.hasError&&(r=s.getFitPos(c),a=t!==o&&e!==o?{width:t,height:e}:n.fancybox.getTranslate(i),r=Math.abs(a.width-r.width)>1.5||Math.abs(a.height-r.height)>1.5),r},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){switch(t.isLoading=!0,a.trigger("beforeLoad",t),e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,t.opts.video.tpl.replace("{{src}}",t.src).replace("{{format}}",t.opts.videoFormat||t.opts.video.format));break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}},setImage:function(e){var o,i,a,s,r,c=this,l=e.opts.srcset||e.opts.image.srcset;if(e.timouts=setTimeout(function(){var t=e.$image;!e.isLoading||t&&t.length&&t[0].complete||e.hasError||c.showLoading(e)},350),l){s=t.devicePixelRatio||1,r=t.innerWidth*s,a=l.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);return 0===n?e.url=t:void(o&&(e.value=o,e.postfix=t[t.length-1]))}),e}),a.sort(function(t,e){return t.value-e.value});for(var d=0;d<a.length;d++){var u=a[d];if("w"===u.postfix&&u.value>=r||"x"===u.postfix&&u.value>=s){i=u;break}}!i&&a.length&&(i=a[a.length-1]),i&&(e.src=i.url,e.width&&e.height&&"w"==i.postfix&&(e.height=e.width/e.height*i.value,e.width=i.value),e.opts.srcset=l)}e.$content=n('<div class="fancybox-content"></div>').addClass("fancybox-is-hidden").appendTo(e.$slide.addClass("fancybox-slide--image")),o=e.opts.thumb||!(!e.opts.$thumb||!e.opts.$thumb.length)&&e.opts.$thumb.attr("src"),e.opts.preload!==!1&&e.opts.width&&e.opts.height&&o&&(e.width=e.opts.width,e.height=e.opts.height,e.$ghost=n("<img />").one("error",function(){n(this).remove(),e.$ghost=null}).one("load",function(){c.afterLoad(e)}).addClass("fancybox-image").appendTo(e.$content).attr("src",o)),c.setBigImage(e)},setBigImage:function(t){var e=this,o=n("<img />");t.$image=o.one("error",function(){e.setError(t)}).one("load",function(){var n;t.$ghost||(e.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),e.afterLoad(t)),t.timouts&&(clearTimeout(t.timouts),t.timouts=null),e.isClosing||(t.opts.srcset&&(n=t.opts.sizes,n&&"auto"!==n||(n=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),o.attr("sizes",n).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!e.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),e.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(o[0].complete||"complete"==o[0].readyState)&&o[0].naturalWidth&&o[0].naturalHeight?o.trigger("load"):o[0].error&&o.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,i=this,a=t.opts.iframe,s=t.$slide;t.$content=n('<div class="fancybox-content'+(a.preload?" fancybox-is-hidden":"")+'"></div>').css(a.css).appendTo(s),s.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(a.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(a.attr).appendTo(t.$content),a.preload?(i.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),i.afterLoad(t)}),s.on("refresh.fb",function(){var n,i,r=t.$content,c=a.css.width,l=a.css.height;if(1===e[0].isReady){try{n=e.contents(),i=n.find("body")}catch(t){}i&&i.length&&i.children().length&&(s.css("overflow","visible"),r.css({width:"100%",height:""}),c===o&&(c=Math.ceil(Math.max(i[0].clientWidth,i.outerWidth(!0)))),c&&r.width(c),l===o&&(l=Math.ceil(Math.max(i[0].clientHeight,i.outerHeight(!0)))),l&&r.height(l),s.css("overflow","auto")),r.removeClass("fancybox-is-hidden")}})):this.afterLoad(t),e.attr("src",t.src),s.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?(e.hasClass("fancybox-content")&&e.parent(".fancybox-slide--html").trigger("onReset"),t.$placeholder=n("<div>").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"===n.type(e)&&(e=n("<div>").append(n.trim(e)).contents()),t.opts.filter&&(e=n("<div>").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.removeClass("fancybox-content").hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1,t.isRevealed=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("<div></div>"),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio,article,.fancybox-content").first(),t.$content.siblings().hide(),t.$content.length||(t.$content=t.$slide.wrapInner("<div></div>").children().first()),t.$content.addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),this.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;t=t||e.current,t&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide))},hideLoading:function(t){var e=this;t=t||e.current,t&&t.$spinner&&(t.$spinner.remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),t.pos===e.currPos&&e.updateCursor(),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).appendTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('<div class="fancybox-spaceball"></div>').appendTo(t.$content)),e.revealContent(t))},revealContent:function(t){var e,i,a,s,r=this,c=t.$slide,l=!1,d=!1,u=r.isMoved(t),p=t.isRevealed;if(!u||!p){if(t.isRevealed=!0,e=t.opts[r.firstRun?"animationEffect":"transitionEffect"],a=t.opts[r.firstRun?"animationDuration":"transitionDuration"],a=parseInt(t.forcedDuration===o?a:t.forcedDuration,10),t.pos===r.currPos&&(t.isComplete?e=!1:r.isAnimating=!0),!u&&t.pos===r.currPos&&a||(e=!1),"zoom"===e&&(t.pos===r.currPos&&a&&"image"===t.type&&!t.hasError&&(d=r.getThumbPos(t))?l=r.getFitPos(t):e="fade"),"zoom"===e)return l.scaleX=l.width/d.width,l.scaleY=l.height/d.height,s=t.opts.zoomOpacity,"auto"==s&&(s=Math.abs(t.width/t.height-d.width/d.height)>.1),s&&(d.opacity=.1,l.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),d),f(t.$content),void n.fancybox.animate(t.$content,l,a,function(){r.isAnimating=!1,r.complete()});if(r.updateSlide(t),!e)return f(c),p||t.$content.removeClass("fancybox-is-hidden").hide().fadeIn("fast"),void(t.pos===r.currPos&&r.complete());n.fancybox.stop(c),i="fancybox-animated fancybox-slide--"+(t.pos>=r.prevPos?"next":"previous")+" fancybox-fx-"+e,c.removeAttr("style").removeClass("fancybox-slide--current fancybox-slide--next fancybox-slide--previous").addClass(i),t.$content.removeClass("fancybox-is-hidden"),f(c),n.fancybox.animate(c,"fancybox-slide--current",a,function(){c.removeClass(i).removeAttr("style"),t.pos===r.currPos&&r.complete()},!0)}},getThumbPos:function(o){var i,a=this,s=!1,r=o.opts.$thumb,c=r&&r.length&&r[0].ownerDocument===e?r.offset():0,l=function(e){for(var o,i=e[0],a=i.getBoundingClientRect(),s=[];null!==i.parentElement;)"hidden"!==n(i.parentElement).css("overflow")&&"auto"!==n(i.parentElement).css("overflow")||s.push(i.parentElement.getBoundingClientRect()),i=i.parentElement;return o=s.every(function(t){var e=Math.min(a.right,t.right)-Math.max(a.left,t.left),n=Math.min(a.bottom,t.bottom)-Math.max(a.top,t.top);return e>0&&n>0}),o&&a.bottom>0&&a.right>0&&a.left<n(t).width()&&a.top<n(t).height()};return c&&l(r)&&(i=a.$refs.stage.offset(),s={top:c.top-i.top+parseFloat(r.css("border-top-width")||0),left:c.left-i.left+parseFloat(r.css("border-left-width")||0),width:r.width(),height:r.height(),scaleX:1,scaleY:1}),s},complete:function(){var t,e=this,o=e.current,i={};!e.isMoved()&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),e.preload("inline"),f(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(e.slides,function(t,o){o.pos>=e.currPos-1&&o.pos<=e.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),e.slides=i),e.isAnimating=!1,e.updateCursor(),e.trigger("afterShow"),o.opts.video.autoStart&&o.$slide.find("video,audio").filter(":visible:first").trigger("play"),o.opts.autoFocus&&"html"===o.contentType&&(t=o.$content.find("input[autofocus]:enabled:visible:first"),t.length?t.trigger("focus"):e.focus(null,!0)),o.$slide.scrollTop(0).scrollLeft(0))},preload:function(t){var e=this,n=e.slides[e.currPos+1],o=e.slides[e.currPos-1];o&&o.type===t&&e.loadSlide(o),n&&n.type===t&&e.loadSlide(n)},focus:function(t,o){var i,a,s=this,r=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","[contenteditable]",'[tabindex]:not([tabindex^="-"])'].join(",");s.isClosing||(i=!t&&s.current&&s.current.isComplete?s.current.$slide.find("*:visible"+(o?":not(.fancybox-close-small)":"")):s.$refs.container.find("*:visible"),i=i.filter(r).filter(function(){return"hidden"!==n(this).css("visibility")&&!n(this).hasClass("disabled")}),i.length?(a=i.index(e.activeElement),t&&t.shiftKey?(a<0||0==a)&&(t.preventDefault(),i.eq(i.length-1).trigger("focus")):(a<0||a==i.length-1)&&(t&&t.preventDefault(),i.eq(0).trigger("focus"))):s.$refs.container.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,p=this,h=p.current,g=function(){p.cleanUp(t)};return!p.isClosing&&(p.isClosing=!0,p.trigger("beforeClose",t)===!1?(p.isClosing=!1,d(function(){p.update()}),!1):(p.removeEvents(),h.timouts&&clearTimeout(h.timouts),a=h.$content,o=h.opts.animationEffect,i=n.isNumeric(e)?e:o?h.opts.animationDuration:0,h.$slide.off(u).removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),h.$slide.siblings().trigger("onReset").remove(),i&&p.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing"),p.hideLoading(h),p.hideControls(),p.updateCursor(),"zoom"!==o||t!==!0&&a&&i&&"image"===h.type&&!h.hasError&&(l=p.getThumbPos(h))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},r=h.opts.zoomOpacity,"auto"==r&&(r=Math.abs(h.width/h.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),f(a),n.fancybox.animate(a,l,i,g),!0):(o&&i?t===!0?setTimeout(g,i):n.fancybox.animate(h.$slide.removeClass("fancybox-slide--current"),"fancybox-animated fancybox-slide--previous fancybox-fx-"+o,i,g):g(),!0)))},cleanUp:function(e){var o,i,a,s=this,r=s.current.opts.$orig;s.current.$slide.trigger("onReset"),s.$refs.container.empty().remove(),s.trigger("afterClose",e),s.current.opts.backFocus&&(r&&r.length&&r.is(":visible")||(r=s.$trigger),r&&r.length&&(i=t.scrollX,a=t.scrollY,r.trigger("focus"),n("html, body").scrollTop(a).scrollLeft(i))),s.current=null,o=n.fancybox.getInstance(),o?o.activate():(n("body").removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove())},trigger:function(t,e){var o,i=Array.prototype.slice.call(arguments,1),a=this,s=e&&e.opts?e:a.current;return s?i.unshift(s):s=a,i.unshift(a),n.isFunction(s.opts[t])&&(o=s.opts[t].apply(s,i)),o===!1?o:void("afterClose"!==t&&a.$refs?a.$refs.container.trigger(t+".fb",i):r.trigger(t+".fb",i))},updateControls:function(){var t=this,o=t.current,i=o.index,a=o.opts.caption,s=t.$refs.container,r=t.$refs.caption;o.$slide.trigger("refresh"),t.$caption=a&&a.length?r.html(a):null,t.isHiddenControls||t.isIdle||t.showControls(),s.find("[data-fancybox-count]").html(t.group.length),s.find("[data-fancybox-index]").html(i+1),s.find("[data-fancybox-prev]").prop("disabled",!o.opts.loop&&i<=0),s.find("[data-fancybox-next]").prop("disabled",!o.opts.loop&&i>=t.group.length-1),"image"===o.type?s.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",o.opts.image.src||o.src).show():o.opts.toolbar&&s.find("[data-fancybox-download],[data-fancybox-zoom]").hide(),n(e.activeElement).is(":hidden,[disabled]")&&t.$refs.container.trigger("focus")},hideControls:function(){this.isHiddenControls=!0,this.$refs.container.removeClass("fancybox-show-infobar fancybox-show-toolbar fancybox-show-caption fancybox-show-nav")},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.isHiddenControls=!1,
12
- t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-caption",!!t.$caption).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal)},toggleControls:function(){this.isHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.4.1",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof h&&("string"===n.type(t)?e[t].apply(e,o):"function"===n.type(t)&&t.apply(e,o),e)},open:function(t,e,n){return new h(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),t===!0&&this.close(t))},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",i={};if(t&&e)return e.left===o&&e.top===o||(n=(e.left===o?t.position().left:e.left)+"px, "+(e.top===o?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),e.scaleX!==o&&e.scaleY!==o&&(n=(n.length?n+" ":"")+"scale("+e.scaleX+", "+e.scaleY+")"),n.length&&(i.transform=n),e.opacity!==o&&(i.opacity=e.opacity),e.width!==o&&(i.width=e.width),e.height!==o&&(i.height=e.height),t.css(i)},animate:function(t,e,i,a,s){var r,c=!1;n.isFunction(i)&&(a=i,i=null),n.isPlainObject(e)||t.removeAttr("style"),n.fancybox.stop(t),t.on(u,function(o){(!o||!o.originalEvent||t.is(o.originalEvent.target)&&"z-index"!=o.originalEvent.propertyName)&&(n.fancybox.stop(t),c&&n.fancybox.setTranslate(t,c),n.isNumeric(i)&&t.css("transition-duration",""),n.isPlainObject(e)?s===!1&&t.removeAttr("style"):s!==!0&&t.removeClass(e),n.isFunction(a)&&a(o))}),n.isNumeric(i)&&t.css("transition-duration",i+"ms"),n.isPlainObject(e)?(e.scaleX!==o&&e.scaleY!==o&&(r=n.fancybox.getTranslate(t),c=n.extend({},e,{width:r.width*e.scaleX,height:r.height*e.scaleY,scaleX:1,scaleY:1}),delete e.width,delete e.height,t.parent().hasClass("fancybox-slide--image")&&t.parent().addClass("fancybox-is-scaling")),n.fancybox.setTranslate(t,e)):t.addClass(e),t.data("timer",setTimeout(function(){t.trigger("transitionend")},i+16))},stop:function(t,e){t&&t.length&&(clearTimeout(t.data("timer")),e&&t.trigger(u),t.off(u).css("transition-duration",""),t.parent().removeClass("fancybox-is-scaling"))}},n.fn.fancybox=function(t){var e;return t=t||{},e=t.selector||!1,e?n("body").off("click.fb-start",e).on("click.fb-start",e,{options:t},i):this.off("click.fb-start").on("click.fb-start",{items:this,options:t},i),this},r.on("click.fb-start","[data-fancybox]",i),r.on("click.fb-start","[data-fancybox-trigger]",function(t){n('[data-fancybox="'+n(this).attr("data-fancybox-trigger")+'"]').eq(n(this).attr("data-fancybox-index")||0).trigger("click.fb-start",{$trigger:n(this)})}),function(){var t=".fancybox-button",e="fancybox-focus",o=null;r.on("mousedown mouseup focus blur",t,function(i){switch(i.type){case"mousedown":o=n(this);break;case"mouseup":o=null;break;case"focusin":n(t).removeClass(e),n(this).is(o)||n(this).is("[disabled]")||n(this).addClass(e);break;case"focusout":n(t).removeClass(e)}})}()}}(window,document,jQuery),function(t){"use strict";var e=function(e,n,o){if(e)return o=o||"","object"===t.type(o)&&(o=t.param(o,!0)),t.each(n,function(t,n){e=e.replace("$"+t,n||"")}),o.length&&(e+=(e.indexOf("?")>0?"&":"?")+o),e},n={youtube:{matcher:/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,params:{autoplay:1,autohide:1,fs:1,rel:0,hd:1,wmode:"transparent",enablejsapi:1,html5:1},paramPlace:8,type:"iframe",url:"//www.youtube-nocookie.com/embed/$4",thumb:"//img.youtube.com/vi/$4/hqdefault.jpg"},vimeo:{matcher:/^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,params:{autoplay:1,hd:1,show_title:1,show_byline:1,show_portrait:0,fullscreen:1,api:1},paramPlace:3,type:"iframe",url:"//player.vimeo.com/video/$2"},instagram:{matcher:/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,type:"image",url:"//$1/p/$2/media/?size=l"},gmap_place:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/?ll="+(t[9]?t[9]+"&z="+Math.floor(t[10])+(t[12]?t[12].replace(/^\//,"&"):""):t[12]+"").replace(/\?/,"&")+"&output="+(t[12]&&t[12].indexOf("layer=c")>0?"svembed":"embed")}},gmap_search:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/maps?q="+t[5].replace("query=","q=").replace("api=1","")+"&output=embed"}}};t(document).on("objectNeedsType.fb",function(o,i,a){var s,r,c,l,d,u,f,p=a.src||"",h=!1;s=t.extend(!0,{},n,a.opts.media),t.each(s,function(n,o){if(c=p.match(o.matcher)){if(h=o.type,f=n,u={},o.paramPlace&&c[o.paramPlace]){d=c[o.paramPlace],"?"==d[0]&&(d=d.substring(1)),d=d.split("&");for(var i=0;i<d.length;++i){var s=d[i].split("=",2);2==s.length&&(u[s[0]]=decodeURIComponent(s[1].replace(/\+/g," ")))}}return l=t.extend(!0,{},o.params,a.opts[n],u),p="function"===t.type(o.url)?o.url.call(this,c,l,a):e(o.url,c,l),r="function"===t.type(o.thumb)?o.thumb.call(this,c,l,a):e(o.thumb,c),"youtube"===n?p=p.replace(/&t=((\d+)m)?(\d+)s/,function(t,e,n,o){return"&start="+((n?60*parseInt(n,10):0)+parseInt(o,10))}):"vimeo"===n&&(p=p.replace("&%23","#")),!1}}),h?(a.opts.thumb||a.opts.$thumb&&a.opts.$thumb.length||(a.opts.thumb=r),"iframe"===h&&(a.opts=t.extend(!0,a.opts,{iframe:{preload:!1,attr:{scrolling:"no"}}})),t.extend(a,{type:h,src:p,origSrc:a.src,contentSource:f,contentType:"image"===h?"image":"gmap_place"==f||"gmap_search"==f?"map":"video"})):p&&(a.type=a.opts.defaultType)})}(jQuery),function(t,e,n){"use strict";var o=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),i=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),a=function(e){var n=[];e=e.originalEvent||e||t.e,e=e.touches&&e.touches.length?e.touches:e.changedTouches&&e.changedTouches.length?e.changedTouches:[e];for(var o in e)e[o].pageX?n.push({x:e[o].pageX,y:e[o].pageY}):e[o].clientX&&n.push({x:e[o].clientX,y:e[o].clientY});return n},s=function(t,e,n){return e&&t?"x"===n?t.x-e.x:"y"===n?t.y-e.y:Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)):0},r=function(t){if(t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio')||n.isFunction(t.get(0).onclick)||t.data("selectable"))return!0;for(var e=0,o=t[0].attributes,i=o.length;e<i;e++)if("data-fancybox-"===o[e].nodeName.substr(0,14))return!0;return!1},c=function(e){var n=t.getComputedStyle(e)["overflow-y"],o=t.getComputedStyle(e)["overflow-x"],i=("scroll"===n||"auto"===n)&&e.scrollHeight>e.clientHeight,a=("scroll"===o||"auto"===o)&&e.scrollWidth>e.clientWidth;return i||a},l=function(t){for(var e=!1;;){if(e=c(t.get(0)))break;if(t=t.parent(),!t.length||t.hasClass("fancybox-stage")||t.is("body"))break}return e},d=function(t){var e=this;e.instance=t,e.$bg=t.$refs.bg,e.$stage=t.$refs.stage,e.$container=t.$refs.container,e.destroy(),e.$container.on("touchstart.fb.touch mousedown.fb.touch",n.proxy(e,"ontouchstart"))};d.prototype.destroy=function(){this.$container.off(".fb.touch")},d.prototype.ontouchstart=function(o){var i=this,c=n(o.target),d=i.instance,u=d.current,f=u.$slide,p=u.$content,h="touchstart"==o.type;if(h&&i.$container.off("mousedown.fb.touch"),(!o.originalEvent||2!=o.originalEvent.button)&&f.length&&c.length&&!r(c)&&!r(c.parent())&&(c.is("img")||!(o.originalEvent.clientX>c[0].clientWidth+c.offset().left))){if(!u||d.isAnimating||d.isClosing)return o.stopPropagation(),void o.preventDefault();if(i.realPoints=i.startPoints=a(o),i.startPoints.length){if(u.touch&&o.stopPropagation(),i.startEvent=o,i.canTap=!0,i.$target=c,i.$content=p,i.opts=u.opts.touch,i.isPanning=!1,i.isSwiping=!1,i.isZooming=!1,i.isScrolling=!1,i.canPan=d.canPan(),i.startTime=(new Date).getTime(),i.distanceX=i.distanceY=i.distance=0,i.canvasWidth=Math.round(f[0].clientWidth),i.canvasHeight=Math.round(f[0].clientHeight),i.contentLastPos=null,i.contentStartPos=n.fancybox.getTranslate(i.$content)||{top:0,left:0},i.sliderStartPos=i.sliderLastPos||n.fancybox.getTranslate(f),i.stagePos=n.fancybox.getTranslate(d.$refs.stage),i.sliderStartPos.top-=i.stagePos.top,i.sliderStartPos.left-=i.stagePos.left,i.contentStartPos.top-=i.stagePos.top,i.contentStartPos.left-=i.stagePos.left,n(e).off(".fb.touch").on(h?"touchend.fb.touch touchcancel.fb.touch":"mouseup.fb.touch mouseleave.fb.touch",n.proxy(i,"ontouchend")).on(h?"touchmove.fb.touch":"mousemove.fb.touch",n.proxy(i,"ontouchmove")),n.fancybox.isMobile&&e.addEventListener("scroll",i.onscroll,!0),!i.opts&&!i.canPan||!c.is(i.$stage)&&!i.$stage.find(c).length)return void(c.is(".fancybox-image")&&o.preventDefault());i.isScrollable=l(c)||l(c.parent()),n.fancybox.isMobile&&i.isScrollable||o.preventDefault(),(1===i.startPoints.length||u.hasError)&&(i.canPan?(n.fancybox.stop(i.$content),i.$content.css("transition-duration",""),i.isPanning=!0):i.isSwiping=!0,i.$container.addClass("fancybox-is-grabbing")),2===i.startPoints.length&&"image"===u.type&&(u.isLoaded||u.$ghost)&&(i.canTap=!1,i.isSwiping=!1,i.isPanning=!1,i.isZooming=!0,n.fancybox.stop(i.$content),i.$content.css("transition-duration",""),i.centerPointStartX=.5*(i.startPoints[0].x+i.startPoints[1].x)-n(t).scrollLeft(),i.centerPointStartY=.5*(i.startPoints[0].y+i.startPoints[1].y)-n(t).scrollTop(),i.percentageOfImageAtPinchPointX=(i.centerPointStartX-i.contentStartPos.left)/i.contentStartPos.width,i.percentageOfImageAtPinchPointY=(i.centerPointStartY-i.contentStartPos.top)/i.contentStartPos.height,i.startDistanceBetweenFingers=s(i.startPoints[0],i.startPoints[1]))}}},d.prototype.onscroll=function(t){var n=this;n.isScrolling=!0,e.removeEventListener("scroll",n.onscroll,!0)},d.prototype.ontouchmove=function(t){var e=this;return void 0!==t.originalEvent.buttons&&0===t.originalEvent.buttons?void e.ontouchend(t):e.isScrolling?void(e.canTap=!1):(e.newPoints=a(t),void((e.opts||e.canPan)&&e.newPoints.length&&e.newPoints.length&&(e.isSwiping&&e.isSwiping===!0||t.preventDefault(),e.distanceX=s(e.newPoints[0],e.startPoints[0],"x"),e.distanceY=s(e.newPoints[0],e.startPoints[0],"y"),e.distance=s(e.newPoints[0],e.startPoints[0]),e.distance>0&&(e.isSwiping?e.onSwipe(t):e.isPanning?e.onPan():e.isZooming&&e.onZoom()))))},d.prototype.onSwipe=function(e){var a,s=this,r=s.isSwiping,c=s.sliderStartPos.left||0;if(r!==!0)"x"==r&&(s.distanceX>0&&(s.instance.group.length<2||0===s.instance.current.index&&!s.instance.current.opts.loop)?c+=Math.pow(s.distanceX,.8):s.distanceX<0&&(s.instance.group.length<2||s.instance.current.index===s.instance.group.length-1&&!s.instance.current.opts.loop)?c-=Math.pow(-s.distanceX,.8):c+=s.distanceX),s.sliderLastPos={top:"x"==r?0:s.sliderStartPos.top+s.distanceY,left:c},s.requestId&&(i(s.requestId),s.requestId=null),s.requestId=o(function(){s.sliderLastPos&&(n.each(s.instance.slides,function(t,e){var o=e.pos-s.instance.currPos;n.fancybox.setTranslate(e.$slide,{top:s.sliderLastPos.top,left:s.sliderLastPos.left+o*s.canvasWidth+o*e.opts.gutter})}),s.$container.addClass("fancybox-is-sliding"))});else if(Math.abs(s.distance)>10){if(s.canTap=!1,s.instance.group.length<2&&s.opts.vertical?s.isSwiping="y":s.instance.isDragging||s.opts.vertical===!1||"auto"===s.opts.vertical&&n(t).width()>800?s.isSwiping="x":(a=Math.abs(180*Math.atan2(s.distanceY,s.distanceX)/Math.PI),s.isSwiping=a>45&&a<135?"y":"x"),s.canTap=!1,"y"===s.isSwiping&&n.fancybox.isMobile&&s.isScrollable)return void(s.isScrolling=!0);s.instance.isDragging=s.isSwiping,s.startPoints=s.newPoints,n.each(s.instance.slides,function(t,e){n.fancybox.stop(e.$slide),e.$slide.css("transition-duration",""),e.inTransition=!1,e.pos===s.instance.current.pos&&(s.sliderStartPos.left=n.fancybox.getTranslate(e.$slide).left-n.fancybox.getTranslate(s.instance.$refs.stage).left)}),s.instance.SlideShow&&s.instance.SlideShow.isActive&&s.instance.SlideShow.stop()}},d.prototype.onPan=function(){var t=this;return s(t.newPoints[0],t.realPoints[0])<(n.fancybox.isMobile?10:5)?void(t.startPoints=t.newPoints):(t.canTap=!1,t.contentLastPos=t.limitMovement(),t.requestId&&(i(t.requestId),t.requestId=null),void(t.requestId=o(function(){n.fancybox.setTranslate(t.$content,t.contentLastPos)})))},d.prototype.limitMovement=function(){var t,e,n,o,i,a,s=this,r=s.canvasWidth,c=s.canvasHeight,l=s.distanceX,d=s.distanceY,u=s.contentStartPos,f=u.left,p=u.top,h=u.width,g=u.height;return i=h>r?f+l:f,a=p+d,t=Math.max(0,.5*r-.5*h),e=Math.max(0,.5*c-.5*g),n=Math.min(r-h,.5*r-.5*h),o=Math.min(c-g,.5*c-.5*g),l>0&&i>t&&(i=t-1+Math.pow(-t+f+l,.8)||0),l<0&&i<n&&(i=n+1-Math.pow(n-f-l,.8)||0),d>0&&a>e&&(a=e-1+Math.pow(-e+p+d,.8)||0),d<0&&a<o&&(a=o+1-Math.pow(o-p-d,.8)||0),{top:a,left:i}},d.prototype.limitPosition=function(t,e,n,o){var i=this,a=i.canvasWidth,s=i.canvasHeight;return n>a?(t=t>0?0:t,t=t<a-n?a-n:t):t=Math.max(0,a/2-n/2),o>s?(e=e>0?0:e,e=e<s-o?s-o:e):e=Math.max(0,s/2-o/2),{top:e,left:t}},d.prototype.onZoom=function(){var e=this,a=e.contentStartPos,r=a.width,c=a.height,l=a.left,d=a.top,u=s(e.newPoints[0],e.newPoints[1]),f=u/e.startDistanceBetweenFingers,p=Math.floor(r*f),h=Math.floor(c*f),g=(r-p)*e.percentageOfImageAtPinchPointX,b=(c-h)*e.percentageOfImageAtPinchPointY,m=(e.newPoints[0].x+e.newPoints[1].x)/2-n(t).scrollLeft(),v=(e.newPoints[0].y+e.newPoints[1].y)/2-n(t).scrollTop(),y=m-e.centerPointStartX,x=v-e.centerPointStartY,w=l+(g+y),$=d+(b+x),S={top:$,left:w,scaleX:f,scaleY:f};e.canTap=!1,e.newWidth=p,e.newHeight=h,e.contentLastPos=S,e.requestId&&(i(e.requestId),e.requestId=null),e.requestId=o(function(){n.fancybox.setTranslate(e.$content,e.contentLastPos)})},d.prototype.ontouchend=function(t){var o=this,s=Math.max((new Date).getTime()-o.startTime,1),r=o.isSwiping,c=o.isPanning,l=o.isZooming,d=o.isScrolling;return o.endPoints=a(t),o.$container.removeClass("fancybox-is-grabbing"),n(e).off(".fb.touch"),e.removeEventListener("scroll",o.onscroll,!0),o.requestId&&(i(o.requestId),o.requestId=null),o.isSwiping=!1,o.isPanning=!1,o.isZooming=!1,o.isScrolling=!1,o.instance.isDragging=!1,o.canTap?o.onTap(t):(o.speed=366,o.velocityX=o.distanceX/s*.5,o.velocityY=o.distanceY/s*.5,o.speedX=Math.max(.5*o.speed,Math.min(1.5*o.speed,1/Math.abs(o.velocityX)*o.speed)),void(c?o.endPanning():l?o.endZooming():o.endSwiping(r,d)))},d.prototype.endSwiping=function(t,e){var o=this,i=!1,a=o.instance.group.length;o.sliderLastPos=null,"y"==t&&!e&&Math.abs(o.distanceY)>50?(n.fancybox.animate(o.instance.current.$slide,{top:o.sliderStartPos.top+o.distanceY+150*o.velocityY,opacity:0},200),i=o.instance.close(!0,200)):"x"==t&&o.distanceX>50&&a>1?i=o.instance.previous(o.speedX):"x"==t&&o.distanceX<-50&&a>1&&(i=o.instance.next(o.speedX)),i!==!1||"x"!=t&&"y"!=t||(e||a<2?o.instance.centerSlide(o.instance.current,150):o.instance.jumpTo(o.instance.current.index)),o.$container.removeClass("fancybox-is-sliding")},d.prototype.endPanning=function(){var t,e,o,i=this;i.contentLastPos&&(i.opts.momentum===!1?(t=i.contentLastPos.left,e=i.contentLastPos.top):(t=i.contentLastPos.left+i.velocityX*i.speed,e=i.contentLastPos.top+i.velocityY*i.speed),o=i.limitPosition(t,e,i.contentStartPos.width,i.contentStartPos.height),o.width=i.contentStartPos.width,o.height=i.contentStartPos.height,n.fancybox.animate(i.$content,o,330))},d.prototype.endZooming=function(){var t,e,o,i,a=this,s=a.instance.current,r=a.newWidth,c=a.newHeight;a.contentLastPos&&(t=a.contentLastPos.left,e=a.contentLastPos.top,i={top:e,left:t,width:r,height:c,scaleX:1,scaleY:1},n.fancybox.setTranslate(a.$content,i),r<a.canvasWidth&&c<a.canvasHeight?a.instance.scaleToFit(150):r>s.width||c>s.height?a.instance.scaleToActual(a.centerPointStartX,a.centerPointStartY,150):(o=a.limitPosition(t,e,r,c),n.fancybox.setTranslate(a.$content,n.fancybox.getTranslate(a.$content)),n.fancybox.animate(a.$content,o,150)))},d.prototype.onTap=function(e){var o,i=this,s=n(e.target),r=i.instance,c=r.current,l=e&&a(e)||i.startPoints,d=l[0]?l[0].x-n(t).scrollLeft()-i.stagePos.left:0,u=l[0]?l[0].y-n(t).scrollTop()-i.stagePos.top:0,f=function(t){var o=c.opts[t];if(n.isFunction(o)&&(o=o.apply(r,[c,e])),o)switch(o){case"close":r.close(i.startEvent);break;case"toggleControls":r.toggleControls(!0);break;case"next":r.next();break;case"nextOrClose":r.group.length>1?r.next():r.close(i.startEvent);break;case"zoom":"image"==c.type&&(c.isLoaded||c.$ghost)&&(r.canPan()?r.scaleToFit():r.isScaledDown()?r.scaleToActual(d,u):r.group.length<2&&r.close(i.startEvent))}};if((!e.originalEvent||2!=e.originalEvent.button)&&(s.is("img")||!(d>s[0].clientWidth+s.offset().left))){if(s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container"))o="Outside";else if(s.is(".fancybox-slide"))o="Slide";else{if(!r.current.$content||!r.current.$content.find(s).addBack().filter(s).length)return;o="Content"}if(i.tapped){if(clearTimeout(i.tapped),i.tapped=null,Math.abs(d-i.tapX)>50||Math.abs(u-i.tapY)>50)return this;f("dblclick"+o)}else i.tapX=d,i.tapY=u,c.opts["dblclick"+o]&&c.opts["dblclick"+o]!==c.opts["click"+o]?i.tapped=setTimeout(function(){i.tapped=null,f("click"+o)},500):f("click"+o);return this}},n(e).on("onActivate.fb",function(t,e){e&&!e.Guestures&&(e.Guestures=new d(e))})}(window,document,jQuery),function(t,e){"use strict";e.extend(!0,e.fancybox.defaults,{btnTpl:{slideShow:'<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg></button>'},slideShow:{autoStart:!1,speed:3e3}});var n=function(t){this.instance=t,this.init()};e.extend(n.prototype,{timer:null,isActive:!1,$button:null,init:function(){var t=this;t.$button=t.instance.$refs.toolbar.find("[data-fancybox-play]").on("click",function(){t.toggle()}),(t.instance.group.length<2||!t.instance.group[t.instance.currIndex].opts.slideShow)&&t.$button.hide()},set:function(t){var e=this,n=e.instance,o=n.current,i=function(){e.isActive&&n.jumpTo((n.currIndex+1)%n.group.length)};o&&(t===!0||o.opts.loop||n.currIndex<n.group.length-1)?e.timer=setTimeout(function(){var t;e.isActive&&(t=o.$slide.find("video,audio").filter(":visible:first"),t.length?t.one("ended",i):i())},o.opts.slideShow.speed):(e.stop(),n.idleSecondsCounter=0,n.showControls())},clear:function(){var t=this;clearTimeout(t.timer),t.timer=null},start:function(){var t=this,e=t.instance.current;e&&(t.$button.attr("title",e.opts.i18n[e.opts.lang].PLAY_STOP).removeClass("fancybox-button--play").addClass("fancybox-button--pause"),t.isActive=!0,e.isComplete&&t.set(!0),t.instance.trigger("onSlideShowChange",!0))},stop:function(){var t=this,e=t.instance.current;t.clear(),t.$button.attr("title",e.opts.i18n[e.opts.lang].PLAY_START).removeClass("fancybox-button--pause").addClass("fancybox-button--play"),t.isActive=!1,t.instance.trigger("onSlideShowChange",!1)},toggle:function(){var t=this;t.isActive?t.stop():t.start()}}),e(t).on({"onInit.fb":function(t,e){e&&!e.SlideShow&&(e.SlideShow=new n(e))},"beforeShow.fb":function(t,e,n,o){var i=e&&e.SlideShow;o?i&&n.opts.slideShow.autoStart&&i.start():i&&i.isActive&&i.clear()},"afterShow.fb":function(t,e,n){var o=e&&e.SlideShow;o&&o.isActive&&o.set()},"afterKeydown.fb":function(n,o,i,a,s){var r=o&&o.SlideShow;!r||!i.opts.slideShow||80!==s&&32!==s||e(t.activeElement).is("button,a,input")||(a.preventDefault(),r.toggle())},"beforeClose.fb onDeactivate.fb":function(t,e){var n=e&&e.SlideShow;n&&n.stop()}}),e(t).on("visibilitychange",function(){var n=e.fancybox.getInstance(),o=n&&n.SlideShow;o&&o.isActive&&(t.hidden?o.clear():o.set())})}(document,jQuery),function(t,e){"use strict";var n=function(){for(var e=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],n={},o=0;o<e.length;o++){var i=e[o];if(i&&i[1]in t){for(var a=0;a<i.length;a++)n[e[0][a]]=i[a];return n}}return!1}();if(n){var o={request:function(e){e=e||t.documentElement,e[n.requestFullscreen](e.ALLOW_KEYBOARD_INPUT)},exit:function(){t[n.exitFullscreen]()},toggle:function(e){e=e||t.documentElement,this.isFullscreen()?this.exit():this.request(e)},isFullscreen:function(){return Boolean(t[n.fullscreenElement])},enabled:function(){return Boolean(t[n.fullscreenEnabled])}};e.extend(!0,e.fancybox.defaults,{btnTpl:{fullScreen:'<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fsenter" title="{{FULL_SCREEN}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"/></svg></button>'},fullScreen:{autoStart:!1}}),e(t).on(n.fullscreenchange,function(){var t=o.isFullscreen(),n=e.fancybox.getInstance();n&&(n.current&&"image"===n.current.type&&n.isAnimating&&(n.current.$content.css("transition","none"),n.isAnimating=!1,n.update(!0,!0,0)),n.trigger("onFullscreenChange",t),n.$refs.container.toggleClass("fancybox-is-fullscreen",t),n.$refs.toolbar.find("[data-fancybox-fullscreen]").toggleClass("fancybox-button--fsenter",!t).toggleClass("fancybox-button--fsexit",t))})}e(t).on({"onInit.fb":function(t,e){var i;return n?void(e&&e.group[e.currIndex].opts.fullScreen?(i=e.$refs.container,i.on("click.fb-fullscreen","[data-fancybox-fullscreen]",function(t){t.stopPropagation(),t.preventDefault(),o.toggle()}),e.opts.fullScreen&&e.opts.fullScreen.autoStart===!0&&o.request(),e.FullScreen=o):e&&e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide()):void e.$refs.toolbar.find("[data-fancybox-fullscreen]").remove()},"afterKeydown.fb":function(t,e,n,o,i){e&&e.FullScreen&&70===i&&(o.preventDefault(),e.FullScreen.toggle())},"beforeClose.fb":function(t,e){e&&e.FullScreen&&e.$refs.container.hasClass("fancybox-is-fullscreen")&&o.exit()}})}(document,jQuery),function(t,e){"use strict";var n="fancybox-thumbs",o=n+"-active";e.fancybox.defaults=e.extend(!0,{btnTpl:{thumbs:'<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.59 14.59h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76H5.65V5.65z"/></svg></button>'},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"}},e.fancybox.defaults);var i=function(t){this.init(t)};e.extend(i.prototype,{$button:null,$grid:null,$list:null,isVisible:!1,isActive:!1,init:function(t){var e,n,o=this;o.instance=t,t.Thumbs=o,o.opts=t.group[t.currIndex].opts.thumbs,e=t.group[0],e=e.opts.thumb||!(!e.opts.$thumb||!e.opts.$thumb.length)&&e.opts.$thumb.attr("src"),t.group.length>1&&(n=t.group[1],n=n.opts.thumb||!(!n.opts.$thumb||!n.opts.$thumb.length)&&n.opts.$thumb.attr("src")),o.$button=t.$refs.toolbar.find("[data-fancybox-thumbs]"),o.opts&&e&&n?(o.$button.show().on("click",function(){o.toggle()}),o.isActive=!0):o.$button.hide()},create:function(){var t,o=this,i=o.instance,a=o.opts.parentEl,s=[];o.$grid||(o.$grid=e('<div class="'+n+" "+n+"-"+o.opts.axis+'"></div>').appendTo(i.$refs.container.find(a).addBack().filter(a)),o.$grid.on("click","a",function(){i.jumpTo(e(this).attr("data-index"))})),o.$list||(o.$list=e('<div class="'+n+'__list">').appendTo(o.$grid)),e.each(i.group,function(e,n){t=n.opts.thumb||(n.opts.$thumb?n.opts.$thumb.attr("src"):null),t||"image"!==n.type||(t=n.src),s.push('<a href="javascript:;" tabindex="0" data-index="'+e+'" '+(t&&t.length?' style="background-image:url('+t+')" />':"")+"></a>")}),o.$list[0].innerHTML=s.join(""),"x"===o.opts.axis&&o.$list.width(parseInt(o.$grid.css("padding-right"),10)+i.group.length*o.$list.children().eq(0).outerWidth(!0))},focus:function(t){var e,n,i=this,a=i.$list,s=i.$grid;i.instance.current&&(e=a.children().removeClass(o).filter('[data-index="'+i.instance.current.index+'"]').addClass(o),n=e.position(),"y"===i.opts.axis&&(n.top<0||n.top>a.height()-e.outerHeight())?a.stop().animate({scrollTop:a.scrollTop()+n.top},t):"x"===i.opts.axis&&(n.left<s.scrollLeft()||n.left>s.scrollLeft()+(s.width()-e.outerWidth()))&&a.parent().stop().animate({scrollLeft:n.left},t))},update:function(){var t=this;t.instance.$refs.container.toggleClass("fancybox-show-thumbs",this.isVisible),t.isVisible?(t.$grid||t.create(),t.instance.trigger("onThumbsShow"),t.focus(0)):t.$grid&&t.instance.trigger("onThumbsHide"),t.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible=!this.isVisible,this.update()}}),e(t).on({"onInit.fb":function(t,e){var n;e&&!e.Thumbs&&(n=new i(e),n.isActive&&n.opts.autoStart===!0&&n.show())},"beforeShow.fb":function(t,e,n,o){var i=e&&e.Thumbs;i&&i.isVisible&&i.focus(o?0:250)},"afterKeydown.fb":function(t,e,n,o,i){var a=e&&e.Thumbs;a&&a.isActive&&71===i&&(o.preventDefault(),a.toggle())},"beforeClose.fb":function(t,e){var n=e&&e.Thumbs;n&&n.isVisible&&n.opts.hideOnClose!==!1&&n.$grid.hide()}})}(document,jQuery),function(t,e){"use strict";function n(t){var e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;","`":"&#x60;","=":"&#x3D;"};return String(t).replace(/[&<>"'`=\/]/g,function(t){return e[t]})}e.extend(!0,e.fancybox.defaults,{btnTpl:{share:'<button data-fancybox-share class="fancybox-button fancybox-button--share" title="{{SHARE}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.55 19c1.4-8.4 9.1-9.8 11.9-9.8V5l7 7-7 6.3v-3.5c-2.8 0-10.5 2.1-11.9 4.2z"/></svg></button>'},share:{url:function(t,e){return!t.currentHash&&"inline"!==e.type&&"html"!==e.type&&(e.origSrc||e.src)||window.location},tpl:'<div class="fancybox-share"><h1>{{SHARE}}</h1><p><a class="fancybox-share__button fancybox-share__button--fb" href="https://www.facebook.com/sharer/sharer.php?u={{url}}"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m287 456v-299c0-21 6-35 35-35h38v-63c-7-1-29-3-55-3-54 0-91 33-91 94v306m143-254h-205v72h196" /></svg><span>Facebook</span></a><a class="fancybox-share__button fancybox-share__button--tw" href="https://twitter.com/intent/tweet?url={{url}}&text={{descr}}"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z" /></svg><span>Twitter</span></a><a class="fancybox-share__button fancybox-share__button--pt" href="https://www.pinterest.com/pin/create/button/?url={{url}}&description={{descr}}&media={{media}}"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m265 56c-109 0-164 78-164 144 0 39 15 74 47 87 5 2 10 0 12-5l4-19c2-6 1-8-3-13-9-11-15-25-15-45 0-58 43-110 113-110 62 0 96 38 96 88 0 67-30 122-73 122-24 0-42-19-36-44 6-29 20-60 20-81 0-19-10-35-31-35-25 0-44 26-44 60 0 21 7 36 7 36l-30 125c-8 37-1 83 0 87 0 3 4 4 5 2 2-3 32-39 42-75l16-64c8 16 31 29 56 29 74 0 124-67 124-157 0-69-58-132-146-132z" fill="#fff"/></svg><span>Pinterest</span></a></p><p><input class="fancybox-share__input" type="text" value="{{url_raw}}" onclick="select()" /></p></div>'}}),e(t).on("click","[data-fancybox-share]",function(){var t,o,i=e.fancybox.getInstance(),a=i.current||null;a&&("function"===e.type(a.opts.share.url)&&(t=a.opts.share.url.apply(a,[i,a])),o=a.opts.share.tpl.replace(/\{\{media\}\}/g,"image"===a.type?encodeURIComponent(a.src):"").replace(/\{\{url\}\}/g,encodeURIComponent(t)).replace(/\{\{url_raw\}\}/g,n(t)).replace(/\{\{descr\}\}/g,i.$caption?encodeURIComponent(i.$caption.text()):""),e.fancybox.open({src:i.translate(i,o),type:"html",opts:{touch:!1,animationEffect:!1,afterLoad:function(t,e){i.$refs.container.one("beforeClose.fb",function(){t.close(null,0)}),e.$content.find(".fancybox-share__button").click(function(){return window.open(this.href,"Share","width=550, height=450"),!1})},mobile:{autoFocus:!1}}}))})}(document,jQuery),function(t,e,n){"use strict";function o(){var e=t.location.hash.substr(1),n=e.split("-"),o=n.length>1&&/^\+?\d+$/.test(n[n.length-1])?parseInt(n.pop(-1),10)||1:1,i=n.join("-");return{hash:e,index:o<1?1:o,gallery:i}}function i(t){""!==t.gallery&&n("[data-fancybox='"+n.escapeSelector(t.gallery)+"']").eq(t.index-1).focus().trigger("click.fb-start")}function a(t){var e,n;return!!t&&(e=t.current?t.current.opts:t.opts,n=e.hash||(e.$orig?e.$orig.data("fancybox")||e.$orig.data("fancybox-trigger"):""),""!==n&&n)}n.escapeSelector||(n.escapeSelector=function(t){var e=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,n=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t};return(t+"").replace(e,n)}),n(function(){n.fancybox.defaults.hash!==!1&&(n(e).on({"onInit.fb":function(t,e){var n,i;e.group[e.currIndex].opts.hash!==!1&&(n=o(),i=a(e),i&&n.gallery&&i==n.gallery&&(e.currIndex=n.index-1))},"beforeShow.fb":function(n,o,i,s){var r;i&&i.opts.hash!==!1&&(r=a(o),r&&(o.currentHash=r+(o.group.length>1?"-"+(i.index+1):""),t.location.hash!=="#"+o.currentHash&&(s&&!o.origHash&&(o.origHash=t.location.hash),o.hashTimer&&clearTimeout(o.hashTimer),o.hashTimer=setTimeout(function(){"replaceState"in t.history?(t.history[s?"pushState":"replaceState"]({},e.title,t.location.pathname+t.location.search+"#"+o.currentHash),s&&(o.hasCreatedHistory=!0)):t.location.hash=o.currentHash,o.hashTimer=null},300))))},"beforeClose.fb":function(n,o,i){i.opts.hash!==!1&&(clearTimeout(o.hashTimer),o.currentHash&&o.hasCreatedHistory?t.history.back():o.currentHash&&("replaceState"in t.history?t.history.replaceState({},e.title,t.location.pathname+t.location.search+(o.origHash||"")):t.location.hash=o.origHash),o.currentHash=null)}}),n(t).on("hashchange.fb",function(){var t=o(),e=null;n.each(n(".fancybox-container").get().reverse(),function(t,o){var i=n(o).data("FancyBox");if(i&&i.currentHash)return e=i,!1}),e?e.currentHash===t.gallery+"-"+t.index||1===t.index&&e.currentHash==t.gallery||(e.currentHash=null,e.close()):""!==t.gallery&&i(t)}),setTimeout(function(){n.fancybox.getInstance()||i(o())},50))})}(window,document,jQuery),function(t,e){"use strict";var n=(new Date).getTime();e(t).on({"onInit.fb":function(t,e,o){e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll",function(t){
13
- var o=e.current,i=(new Date).getTime();e.group.length<2||o.opts.wheel===!1||"auto"===o.opts.wheel&&"image"!==o.type||(t.preventDefault(),t.stopPropagation(),o.$slide.hasClass("fancybox-animated")||(t=t.originalEvent||t,i-n<250||(n=i,e[(-t.deltaY||-t.deltaX||t.wheelDelta||-t.detail)<0?"next":"previous"]())))})}})}(document,jQuery);
14
 
15
  var fv_player_fancybox_paused_players = {};
16
 
@@ -40,12 +40,16 @@ function fv_player_colorbox_title() {
40
  return '';
41
  }
42
 
 
43
  jQuery.fancybox.defaults.smallBtn = false;
44
  jQuery.fancybox.defaults.toolbar = true;
45
  jQuery.fancybox.defaults.thumbs.hideOnClose = false;
46
  jQuery.fancybox.defaults.caption = fv_player_colorbox_title;
47
  jQuery.fancybox.defaults.afterLoad = fv_fancybox_check_size;
48
- jQuery.fancybox.defaults.onThumbsShow = function() {
 
 
 
49
  jQuery(jQuery.fancybox.getInstance().group).each( function(k,v) {
50
  if( v.src.match(/^#wpfp_/) ) {
51
  jQuery('.fancybox-thumbs li[data-index='+k+']').append('<span class="fv-player-fancybox-play-icon">&#9654;</span>');
@@ -55,8 +59,16 @@ jQuery.fancybox.defaults.onThumbsShow = function() {
55
  }
56
  })
57
  }
58
- jQuery.fancybox.defaults.hash = false;
59
- jQuery.fancybox.defaults.buttons = ["slideShow","fullScreen","thumbs","close"];
 
 
 
 
 
 
 
 
60
 
61
  jQuery(document).ready(function() {
62
  jQuery(".colorbox[href^='#']:not([data-cbox-inline]), .lightbox[href^='#']").filter(function () {
@@ -158,10 +170,10 @@ function fv_lightbox_flowplayer_shutdown(e) {
158
  return;
159
  }
160
 
161
- if( e.type == 'afterShow' && jQuery(this).parents('.fancybox-slide--current').length ) return;
162
 
163
- // if this player was previously paused on fancybox show, unpause it
164
- if ( typeof( fv_player_fancybox_paused_players[ player_id ] ) != 'undefined' ) {
165
  was_paused = true;
166
  delete fv_player_fancybox_paused_players[ $e.attr('id') ];
167
  api.resume();
@@ -173,7 +185,7 @@ function fv_lightbox_flowplayer_shutdown(e) {
173
  }
174
 
175
  if( api.loading ) {
176
- api.one('ready',function(){
177
  if ( api.engine.engineName === 'fvyoutube' && api.playing && !was_paused ) {
178
  fv_player_fancybox_paused_players[ $e.attr('id') ] = 1;
179
  api.pause();
@@ -185,7 +197,7 @@ function fv_lightbox_flowplayer_shutdown(e) {
185
 
186
  jQuery(document).on('afterShow.fb afterClose.fb', fv_lightbox_flowplayer_shutdown);
187
 
188
- jQuery(window).resize(fv_fancybox_check_size);
189
 
190
  if( document.addEventListener ) {
191
  var fv_orientation_change_timer = -1;
@@ -207,8 +219,30 @@ if( document.addEventListener ) {
207
  jQuery( function() {
208
  if( typeof(flowplayer) != "undefined" ) {
209
  flowplayer( function(api,root) {
210
- var lightbox_wrap = jQuery(root).closest('.fv_player_lightbox_hidden');
211
- if( lightbox_wrap.length ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
  lightbox_wrap.on('click', function(e) {
213
  if( e.target == e.currentTarget) {
214
  jQuery.fancybox.close();
@@ -231,6 +265,14 @@ jQuery( function() {
231
  if( fancybox_thumbs ) jQuery('.fancybox-container').addClass('fancybox-show-thumbs');
232
  });
233
  }
 
 
 
 
 
 
 
 
234
  }
235
  });
236
  }
@@ -288,7 +330,7 @@ jQuery(document).on('click', '.flowplayer.lightbox-starter, .fv-player-lightbox-
288
  } else {
289
  api.play(index);
290
  }
291
- fv_fancybox_check_size()
292
 
293
  if( playlist.length && !jQuery(this).data('fancybox') ) {
294
  playlist.find('a[data-fancybox]').eq(0).click();
1
  // ==================================================
2
+ // fancyBox v3.5.7
3
  //
4
  // Licensed GPLv3 for open source use
5
  // or fancyBox Commercial License for commercial use
6
  //
7
  // http://fancyapps.com/fancybox/
8
+ // Copyright 2021 fancyApps
9
  //
10
  // ==================================================
11
+ !function(t,e,n,o){"use strict";function i(t,e){var o,i,a,s=[],r=0;t&&t.isDefaultPrevented()||(t.preventDefault(),e=e||{},t&&t.data&&(e=h(t.data.options,e)),o=e.$target||n(t.currentTarget).trigger("blur"),(a=n.fancybox.getInstance())&&a.$trigger&&a.$trigger.is(o)||(e.selector?s=n(e.selector):(i=o.attr("data-fancybox")||"",i?(s=t.data?t.data.items:[],s=s.length?s.filter('[data-fancybox="'+i+'"]'):n('[data-fancybox="'+i+'"]')):s=[o]),r=n(s).index(o),r<0&&(r=0),a=n.fancybox.open(s,e,r),a.$trigger=o))}if(t.console=t.console||{info:function(t){}},n){if(n.fn.fancybox)return void console.info("fancyBox already initialized");var a={closeExisting:!1,loop:!1,gutter:50,keyboard:!0,preventCaptionOverlap:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","slideShow","thumbs","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{data:{fancybox:!0}}},iframe:{tpl:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" allowfullscreen="allowfullscreen" allow="autoplay; fullscreen" src=""></iframe>',preload:!0,css:{},attr:{scrolling:"auto"}},video:{tpl:'<video class="fancybox-video" controls controlsList="nodownload" poster="{{poster}}"><source src="{{src}}" type="{{format}}" />Sorry, your browser doesn\'t support embedded videos, <a href="{{src}}">download</a> and watch with your favorite video player!</video>',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'<div class="fancybox-container" role="dialog" tabindex="-1"><div class="fancybox-bg"></div><div class="fancybox-inner"><div class="fancybox-infobar"><span data-fancybox-index></span>&nbsp;/&nbsp;<span data-fancybox-count></span></div><div class="fancybox-toolbar">{{buttons}}</div><div class="fancybox-navigation">{{arrows}}</div><div class="fancybox-stage"></div><div class="fancybox-caption"><div class="fancybox-caption__body"></div></div></div></div>',spinnerTpl:'<div class="fancybox-loading"></div>',errorTpl:'<div class="fancybox-error"><p>{{ERROR}}</p></div>',btnTpl:{download:'<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.62 17.09V19H5.38v-1.91zm-2.97-6.96L17 11.45l-5 4.87-5-4.87 1.36-1.32 2.68 2.64V5h1.92v7.77z"/></svg></a>',zoom:'<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.7 17.3l-3-3a5.9 5.9 0 0 0-.6-7.6 5.9 5.9 0 0 0-8.4 0 5.9 5.9 0 0 0 0 8.4 5.9 5.9 0 0 0 7.7.7l3 3a1 1 0 0 0 1.3 0c.4-.5.4-1 0-1.5zM8.1 13.8a4 4 0 0 1 0-5.7 4 4 0 0 1 5.7 0 4 4 0 0 1 0 5.7 4 4 0 0 1-5.7 0z"/></svg></button>',close:'<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10.6L6.6 5.2 5.2 6.6l5.4 5.4-5.4 5.4 1.4 1.4 5.4-5.4 5.4 5.4 1.4-1.4-5.4-5.4 5.4-5.4-1.4-1.4-5.4 5.4z"/></svg></button>',arrowLeft:'<button data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}"><div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.28 15.7l-1.34 1.37L5 12l4.94-5.07 1.34 1.38-2.68 2.72H19v1.94H8.6z"/></svg></div></button>',arrowRight:'<button data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}"><div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 12.97l-2.68 2.72 1.34 1.38L19 12l-4.94-5.07-1.34 1.38 2.68 2.72H5v1.94z"/></svg></div></button>',smallBtn:'<button type="button" data-fancybox-close class="fancybox-button fancybox-close-small" title="{{CLOSE}}"><svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 24 24"><path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"/></svg></button>'},parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{preventCaptionOverlap:!1,idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded. <br/> Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schlie&szlig;en",NEXT:"Weiter",PREV:"Zur&uuml;ck",ERROR:"Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es sp&auml;ter nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Vergr&ouml;&szlig;ern"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),f=function(){var t,n=e.createElement("fakeelement"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in o)if(void 0!==n.style[t])return o[t];return"transitionend"}(),p=function(t){return t&&t.length&&t[0].offsetHeight},h=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){Array.isArray(e)&&(o[t]=e)}),o},g=function(t){var o,i;return!(!t||t.ownerDocument!==e)&&(n(".fancybox-container").css("pointer-events","none"),o={x:t.getBoundingClientRect().left+t.offsetWidth/2,y:t.getBoundingClientRect().top+t.offsetHeight/2},i=e.elementFromPoint(o.x,o.y)===t,n(".fancybox-container").css("pointer-events",""),i)},b=function(t,e,o){var i=this;i.opts=h({index:o},n.fancybox.defaults),n.isPlainObject(e)&&(i.opts=h(i.opts,e)),n.fancybox.isMobile&&(i.opts=h(i.opts,i.opts.mobile)),i.id=i.opts.id||++c,i.currIndex=parseInt(i.opts.index,10)||0,i.prevIndex=null,i.prevPos=null,i.currPos=0,i.firstRun=!0,i.group=[],i.slides={},i.addContent(t),i.group.length&&i.init()};n.extend(b.prototype,{init:function(){var o,i,a=this,s=a.group[a.currIndex],r=s.opts;r.closeExisting&&n.fancybox.close(!0),n("body").addClass("fancybox-active"),!n.fancybox.getInstance()&&!1!==r.hideScrollbar&&!n.fancybox.isMobile&&e.body.scrollHeight>t.innerHeight&&(n("head").append('<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar{margin-right:'+(t.innerWidth-e.documentElement.clientWidth)+"px;}</style>"),n("body").addClass("compensate-for-scrollbar")),i="",n.each(r.buttons,function(t,e){i+=r.btnTpl[e]||""}),o=n(a.translate(a,r.baseTpl.replace("{{buttons}}",i).replace("{{arrows}}",r.btnTpl.arrowLeft+r.btnTpl.arrowRight))).attr("id","fancybox-container-"+a.id).addClass(r.baseClass).data("FancyBox",a).appendTo(r.parentEl),a.$refs={container:o},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){a.$refs[t]=o.find(".fancybox-"+t)}),a.trigger("onInit"),a.activate(),a.jumpTo(a.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang]||t.opts.i18n.en;return e.replace(/\{\{(\w+)\}\}/g,function(t,e){return void 0===n[e]?t:n[e]})},addContent:function(t){var e,o=this,i=n.makeArray(t);n.each(i,function(t,e){var i,a,s,r,c,l={},d={};n.isPlainObject(e)?(l=e,d=e.opts||e):"object"==typeof e&&n(e).length?(i=n(e),d=i.data()||{},d=n.extend(!0,{},d,d.options),d.$orig=i,l.src=o.opts.src||d.src||i.attr("href"),l.type||l.src||(l.type="inline",l.src=e)):l={type:"html",src:e+""},l.opts=n.extend(!0,{},o.opts,d),Array.isArray(d.buttons)&&(l.opts.buttons=d.buttons),n.fancybox.isMobile&&l.opts.mobile&&(l.opts=h(l.opts,l.opts.mobile)),a=l.type||l.opts.type,r=l.src||"",!a&&r&&((s=r.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))?(a="video",l.opts.video.format||(l.opts.video.format="video/"+("ogv"===s[1]?"ogg":s[1]))):r.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?a="image":r.match(/\.(pdf)((\?|#).*)?$/i)?(a="iframe",l=n.extend(!0,l,{contentType:"pdf",opts:{iframe:{preload:!1}}})):"#"===r.charAt(0)&&(a="inline")),a?l.type=a:o.trigger("objectNeedsType",l),l.contentType||(l.contentType=n.inArray(l.type,["html","inline","ajax"])>-1?"html":l.type),l.index=o.group.length,"auto"==l.opts.smallBtn&&(l.opts.smallBtn=n.inArray(l.type,["html","inline","ajax"])>-1),"auto"===l.opts.toolbar&&(l.opts.toolbar=!l.opts.smallBtn),l.$thumb=l.opts.$thumb||null,l.opts.$trigger&&l.index===o.opts.index&&(l.$thumb=l.opts.$trigger.find("img:first"),l.$thumb.length&&(l.opts.$orig=l.opts.$trigger)),l.$thumb&&l.$thumb.length||!l.opts.$orig||(l.$thumb=l.opts.$orig.find("img:first")),l.$thumb&&!l.$thumb.length&&(l.$thumb=null),l.thumb=l.opts.thumb||(l.$thumb?l.$thumb[0].src:null),"function"==typeof l.opts.caption&&(l.opts.caption=l.opts.caption.apply(e,[o,l])),"function"==typeof o.opts.caption&&(l.opts.caption=o.opts.caption.apply(e,[o,l])),l.opts.caption instanceof n||(l.opts.caption=void 0===l.opts.caption?"":l.opts.caption+""),"ajax"===l.type&&(c=r.split(/\s+/,2),c.length>1&&(l.src=c.shift(),l.opts.filter=c.shift())),l.opts.modal&&(l.opts=n.extend(!0,l.opts,{trapFocus:!0,infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),o.group.push(l)}),Object.keys(o.slides).length&&(o.updateControls(),(e=o.Thumbs)&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var e=this;e.removeEvents(),e.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),e.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),e.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),e.next()}).on("click.fb","[data-fancybox-zoom]",function(t){e[e.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?(e.requestId&&u(e.requestId),e.requestId=d(function(){e.update(t)})):(e.current&&"iframe"===e.current.type&&e.$refs.stage.hide(),setTimeout(function(){e.$refs.stage.show(),e.update(t)},n.fancybox.isMobile?600:250))}),r.on("keydown.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null,i=o.current,a=t.keyCode||t.which;if(9==a)return void(i.opts.trapFocus&&e.focus(t));if(!(!i.opts.keyboard||t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input,textarea,video,audio,select")))return 8===a||27===a?(t.preventDefault(),void e.close(t)):37===a||38===a?(t.preventDefault(),void e.previous()):39===a||40===a?(t.preventDefault(),void e.next()):void e.trigger("afterKeydown",t,a)}),e.group[e.currIndex].opts.idleTime&&(e.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){e.idleSecondsCounter=0,e.isIdle&&e.showControls(),e.isIdle=!1}),e.idleInterval=t.setInterval(function(){++e.idleSecondsCounter>=e.group[e.currIndex].opts.idleTime&&!e.isDragging&&(e.isIdle=!0,e.idleSecondsCounter=0,e.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var o,i,a,s,r,c,l,d,u,f=this,h=f.group.length;if(!(f.isDragging||f.isClosing||f.isAnimating&&f.firstRun)){if(t=parseInt(t,10),!(a=f.current?f.current.opts.loop:f.opts.loop)&&(t<0||t>=h))return!1;if(o=f.firstRun=!Object.keys(f.slides).length,r=f.current,f.prevIndex=f.currIndex,f.prevPos=f.currPos,s=f.createSlide(t),h>1&&((a||s.index<h-1)&&f.createSlide(t+1),(a||s.index>0)&&f.createSlide(t-1)),f.current=s,f.currIndex=s.index,f.currPos=s.pos,f.trigger("beforeShow",o),f.updateControls(),s.forcedDuration=void 0,!isNaN(parseFloat(e))&&isFinite(e)?s.forcedDuration=e:e=s.opts[o?"animationDuration":"transitionDuration"],e=parseInt(e,10),i=f.isMoved(s),s.$slide.addClass("fancybox-slide--current"),o)return s.opts.animationEffect&&e&&f.$refs.container.css("transition-duration",e+"ms"),f.$refs.container.addClass("fancybox-is-open").trigger("focus"),f.loadSlide(s),void f.preload("image");c=n.fancybox.getTranslate(r.$slide),l=n.fancybox.getTranslate(f.$refs.stage),n.each(f.slides,function(t,e){n.fancybox.stop(e.$slide,!0)}),r.pos!==s.pos&&(r.isComplete=!1),r.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"),i?(u=c.left-(r.pos*c.width+r.pos*r.opts.gutter),n.each(f.slides,function(t,o){o.$slide.removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")});var i=o.pos*c.width+o.pos*o.opts.gutter;n.fancybox.setTranslate(o.$slide,{top:0,left:i-l.left+u}),o.pos!==s.pos&&o.$slide.addClass("fancybox-slide--"+(o.pos>s.pos?"next":"previous")),p(o.$slide),n.fancybox.animate(o.$slide,{top:0,left:(o.pos-s.pos)*c.width+(o.pos-s.pos)*o.opts.gutter},e,function(){o.$slide.css({transform:"",opacity:""}).removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===f.currPos&&f.complete()})})):e&&s.opts.transitionEffect&&(d="fancybox-animated fancybox-fx-"+s.opts.transitionEffect,r.$slide.addClass("fancybox-slide--"+(r.pos>s.pos?"next":"previous")),n.fancybox.animate(r.$slide,d,e,function(){r.$slide.removeClass(d).removeClass("fancybox-slide--next fancybox-slide--previous")},!1)),s.isLoaded?f.revealContent(s):f.loadSlide(s),f.preload("image")}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('<div class="fancybox-slide"></div>').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]},scaleToActual:function(t,e,o){var i,a,s,r,c,l=this,d=l.current,u=d.$content,f=n.fancybox.getTranslate(d.$slide).width,p=n.fancybox.getTranslate(d.$slide).height,h=d.width,g=d.height;l.isAnimating||l.isMoved()||!u||"image"!=d.type||!d.isLoaded||d.hasError||(l.isAnimating=!0,n.fancybox.stop(u),t=void 0===t?.5*f:t,e=void 0===e?.5*p:e,i=n.fancybox.getTranslate(u),i.top-=n.fancybox.getTranslate(d.$slide).top,i.left-=n.fancybox.getTranslate(d.$slide).left,r=h/i.width,c=g/i.height,a=.5*f-.5*h,s=.5*p-.5*g,h>f&&(a=i.left*r-(t*r-t),a>0&&(a=0),a<f-h&&(a=f-h)),g>p&&(s=i.top*c-(e*c-e),s>0&&(s=0),s<p-g&&(s=p-g)),l.updateCursor(h,g),n.fancybox.animate(u,{top:s,left:a,scaleX:r,scaleY:c},o||366,function(){l.isAnimating=!1}),l.SlideShow&&l.SlideShow.isActive&&l.SlideShow.stop())},scaleToFit:function(t){var e,o=this,i=o.current,a=i.$content;o.isAnimating||o.isMoved()||!a||"image"!=i.type||!i.isLoaded||i.hasError||(o.isAnimating=!0,n.fancybox.stop(a),e=o.getFitPos(i),o.updateCursor(e.width,e.height),n.fancybox.animate(a,{top:e.top,left:e.left,scaleX:e.width/a.width(),scaleY:e.height/a.height()},t||366,function(){o.isAnimating=!1}))},getFitPos:function(t){var e,o,i,a,s=this,r=t.$content,c=t.$slide,l=t.width||t.opts.width,d=t.height||t.opts.height,u={};return!!(t.isLoaded&&r&&r.length)&&(e=n.fancybox.getTranslate(s.$refs.stage).width,o=n.fancybox.getTranslate(s.$refs.stage).height,e-=parseFloat(c.css("paddingLeft"))+parseFloat(c.css("paddingRight"))+parseFloat(r.css("marginLeft"))+parseFloat(r.css("marginRight")),o-=parseFloat(c.css("paddingTop"))+parseFloat(c.css("paddingBottom"))+parseFloat(r.css("marginTop"))+parseFloat(r.css("marginBottom")),l&&d||(l=e,d=o),i=Math.min(1,e/l,o/d),l*=i,d*=i,l>e-.5&&(l=e),d>o-.5&&(d=o),"image"===t.type?(u.top=Math.floor(.5*(o-d))+parseFloat(c.css("paddingTop")),u.left=Math.floor(.5*(e-l))+parseFloat(c.css("paddingLeft"))):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?l/d:t.opts.ratio||16/9,d>l/a?d=l/a:l>d*a&&(l=d*a)),u.width=l,u.height=d,u)},update:function(t){var e=this;n.each(e.slides,function(n,o){e.updateSlide(o,t)})},updateSlide:function(t,e){var o=this,i=t&&t.$content,a=t.width||t.opts.width,s=t.height||t.opts.height,r=t.$slide;o.adjustCaption(t),i&&(a||s||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(i),n.fancybox.setTranslate(i,o.getFitPos(t)),t.pos===o.currPos&&(o.isAnimating=!1,o.updateCursor())),o.adjustLayout(t),r.length&&(r.trigger("refresh"),t.pos===o.currPos&&o.$refs.toolbar.add(o.$refs.navigation.find(".fancybox-button--arrow_right")).toggleClass("compensate-for-scrollbar",r.get(0).scrollHeight>r.get(0).clientHeight)),o.trigger("onUpdate",t,e)},centerSlide:function(t){var e=this,o=e.current,i=o.$slide;!e.isClosing&&o&&(i.siblings().css({transform:"",opacity:""}),i.parent().children().removeClass("fancybox-slide--previous fancybox-slide--next"),n.fancybox.animate(i,{top:0,left:0,opacity:1},void 0===t?0:t,function(){i.css({transform:"",opacity:""}),o.isComplete||e.complete()},!1))},isMoved:function(t){var e,o,i=t||this.current;return!!i&&(o=n.fancybox.getTranslate(this.$refs.stage),e=n.fancybox.getTranslate(i.$slide),!i.$slide.hasClass("fancybox-animated")&&(Math.abs(e.top-o.top)>.5||Math.abs(e.left-o.left)>.5))},updateCursor:function(t,e){var o,i,a=this,s=a.current,r=a.$refs.container;s&&!a.isClosing&&a.Guestures&&(r.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"),o=a.canPan(t,e),i=!!o||a.isZoomable(),r.toggleClass("fancybox-is-zoomable",i),n("[data-fancybox-zoom]").prop("disabled",!i),o?r.addClass("fancybox-can-pan"):i&&("zoom"===s.opts.clickContent||"function"==typeof s.opts.clickContent&&"zoom"==s.opts.clickContent(s))?r.addClass("fancybox-can-zoomIn"):s.opts.touch&&(s.opts.touch.vertical||a.group.length>1)&&"video"!==s.contentType&&r.addClass("fancybox-can-swipe"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if((t=e.getFitPos(n))&&(n.width>t.width||n.height>t.height))return!0}return!1},isScaledDown:function(t,e){var o=this,i=!1,a=o.current,s=a.$content;return void 0!==t&&void 0!==e?i=t<a.width&&e<a.height:s&&(i=n.fancybox.getTranslate(s),i=i.width<a.width&&i.height<a.height),i},canPan:function(t,e){var o=this,i=o.current,a=null,s=!1;return"image"===i.type&&(i.isComplete||t&&e)&&!i.hasError&&(s=o.getFitPos(i),void 0!==t&&void 0!==e?a={width:t,height:e}:i.isComplete&&(a=n.fancybox.getTranslate(i.$content)),a&&s&&(s=Math.abs(a.width-s.width)>1.5||Math.abs(a.height-s.height)>1.5)),s},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){if(t.isLoading=!0,!1===a.trigger("beforeLoad",t))return t.isLoading=!1,!1;switch(e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,t.opts.video.tpl.replace(/\{\{src\}\}/gi,t.src).replace("{{format}}",t.opts.videoFormat||t.opts.video.format||"").replace("{{poster}}",t.thumb||""));break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}},setImage:function(t){var o,i=this;setTimeout(function(){var e=t.$image;i.isClosing||!t.isLoading||e&&e.length&&e[0].complete||t.hasError||i.showLoading(t)},50),i.checkSrcset(t),t.$content=n('<div class="fancybox-content"></div>').addClass("fancybox-is-hidden").appendTo(t.$slide.addClass("fancybox-slide--image")),!1!==t.opts.preload&&t.opts.width&&t.opts.height&&t.thumb&&(t.width=t.opts.width,t.height=t.opts.height,o=e.createElement("img"),o.onerror=function(){n(this).remove(),t.$ghost=null},o.onload=function(){i.afterLoad(t)},t.$ghost=n(o).addClass("fancybox-image").appendTo(t.$content).attr("src",t.thumb)),i.setBigImage(t)},checkSrcset:function(e){var n,o,i,a,s=e.opts.srcset||e.opts.image.srcset;if(s){i=t.devicePixelRatio||1,a=t.innerWidth*i,o=s.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);if(0===n)return e.url=t;o&&(e.value=o,e.postfix=t[t.length-1])}),e}),o.sort(function(t,e){return t.value-e.value});for(var r=0;r<o.length;r++){var c=o[r];if("w"===c.postfix&&c.value>=a||"x"===c.postfix&&c.value>=i){n=c;break}}!n&&o.length&&(n=o[o.length-1]),n&&(e.src=n.url,e.width&&e.height&&"w"==n.postfix&&(e.height=e.width/e.height*n.value,e.width=n.value),e.opts.srcset=s)}},setBigImage:function(t){var o=this,i=e.createElement("img"),a=n(i);t.$image=a.one("error",function(){o.setError(t)}).one("load",function(){var e;t.$ghost||(o.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),o.afterLoad(t)),o.isClosing||(t.opts.srcset&&(e=t.opts.sizes,e&&"auto"!==e||(e=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),a.attr("sizes",e).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!o.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),o.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(i.complete||"complete"==i.readyState)&&a.naturalWidth&&a.naturalHeight?a.trigger("load"):i.error&&a.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,o=this,i=t.opts.iframe,a=t.$slide;t.$content=n('<div class="fancybox-content'+(i.preload?" fancybox-is-hidden":"")+'"></div>').css(i.css).appendTo(a),a.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(i.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(i.attr).appendTo(t.$content),i.preload?(o.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),o.afterLoad(t)}),a.on("refresh.fb",function(){var n,o,s=t.$content,r=i.css.width,c=i.css.height;if(1===e[0].isReady){try{n=e.contents(),o=n.find("body")}catch(t){}o&&o.length&&o.children().length&&(a.css("overflow","visible"),s.css({width:"100%","max-width":"100%",height:"9999px"}),void 0===r&&(r=Math.ceil(Math.max(o[0].clientWidth,o.outerWidth(!0)))),s.css("width",r||"").css("max-width",""),void 0===c&&(c=Math.ceil(Math.max(o[0].clientHeight,o.outerHeight(!0)))),s.css("height",c||""),a.css("overflow","auto")),s.removeClass("fancybox-is-hidden")}})):o.afterLoad(t),e.attr("src",t.src),a.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1,t.isRevealed=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?((e.hasClass("fancybox-content")||e.parent().hasClass("fancybox-content"))&&e.parents(".fancybox-slide").trigger("onReset"),t.$placeholder=n("<div>").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"==typeof e&&(e=n("<div>").append(n.trim(e)).contents()),t.opts.filter&&(e=n("<div>").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.removeClass("fancybox-content").hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1,t.isRevealed=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("<div></div>"),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio,article,.fancybox-content").first(),t.$content.siblings().hide(),t.$content.length||(t.$content=t.$slide.wrapInner("<div></div>").children().first()),t.$content.addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),o.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;(t=t||e.current)&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide).hide().fadeIn("fast"))},hideLoading:function(t){var e=this;(t=t||e.current)&&t.$spinner&&(t.$spinner.stop().remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).appendTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('<div class="fancybox-spaceball"></div>').appendTo(t.$content)),e.adjustCaption(t),e.adjustLayout(t),t.pos===e.currPos&&e.updateCursor(),e.revealContent(t))},adjustCaption:function(t){var e,n=this,o=t||n.current,i=o.opts.caption,a=o.opts.preventCaptionOverlap,s=n.$refs.caption,r=!1;s.toggleClass("fancybox-caption--separate",a),a&&i&&i.length&&(o.pos!==n.currPos?(e=s.clone().appendTo(s.parent()),e.children().eq(0).empty().html(i),r=e.outerHeight(!0),e.empty().remove()):n.$caption&&(r=n.$caption.outerHeight(!0)),o.$slide.css("padding-bottom",r||""))},adjustLayout:function(t){var e,n,o,i,a=this,s=t||a.current;s.isLoaded&&!0!==s.opts.disableLayoutFix&&(s.$content.css("margin-bottom",""),s.$content.outerHeight()>s.$slide.height()+.5&&(o=s.$slide[0].style["padding-bottom"],i=s.$slide.css("padding-bottom"),parseFloat(i)>0&&(e=s.$slide[0].scrollHeight,s.$slide.css("padding-bottom",0),Math.abs(e-s.$slide[0].scrollHeight)<1&&(n=i),s.$slide.css("padding-bottom",o))),s.$content.css("margin-bottom",n))},revealContent:function(t){var e,o,i,a,s=this,r=t.$slide,c=!1,l=!1,d=s.isMoved(t),u=t.isRevealed;return t.isRevealed=!0,e=t.opts[s.firstRun?"animationEffect":"transitionEffect"],i=t.opts[s.firstRun?"animationDuration":"transitionDuration"],i=parseInt(void 0===t.forcedDuration?i:t.forcedDuration,10),!d&&t.pos===s.currPos&&i||(e=!1),"zoom"===e&&(t.pos===s.currPos&&i&&"image"===t.type&&!t.hasError&&(l=s.getThumbPos(t))?c=s.getFitPos(t):e="fade"),"zoom"===e?(s.isAnimating=!0,c.scaleX=c.width/l.width,c.scaleY=c.height/l.height,a=t.opts.zoomOpacity,"auto"==a&&(a=Math.abs(t.width/t.height-l.width/l.height)>.1),a&&(l.opacity=.1,c.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),l),p(t.$content),void n.fancybox.animate(t.$content,c,i,function(){s.isAnimating=!1,s.complete()})):(s.updateSlide(t),e?(n.fancybox.stop(r),o="fancybox-slide--"+(t.pos>=s.prevPos?"next":"previous")+" fancybox-animated fancybox-fx-"+e,r.addClass(o).removeClass("fancybox-slide--current"),t.$content.removeClass("fancybox-is-hidden"),p(r),"image"!==t.type&&t.$content.hide().show(0),void n.fancybox.animate(r,"fancybox-slide--current",i,function(){r.removeClass(o).css({transform:"",opacity:""}),t.pos===s.currPos&&s.complete()},!0)):(t.$content.removeClass("fancybox-is-hidden"),u||!d||"image"!==t.type||t.hasError||t.$content.hide().fadeIn("fast"),void(t.pos===s.currPos&&s.complete())))},getThumbPos:function(t){var e,o,i,a,s,r=!1,c=t.$thumb;return!(!c||!g(c[0]))&&(e=n.fancybox.getTranslate(c),o=parseFloat(c.css("border-top-width")||0),i=parseFloat(c.css("border-right-width")||0),a=parseFloat(c.css("border-bottom-width")||0),s=parseFloat(c.css("border-left-width")||0),r={top:e.top+o,left:e.left+s,width:e.width-i-s,height:e.height-o-a,scaleX:1,scaleY:1},e.width>0&&e.height>0&&r)},complete:function(){var t,e=this,o=e.current,i={};!e.isMoved()&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),e.preload("inline"),p(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(e.slides,function(t,o){o.pos>=e.currPos-1&&o.pos<=e.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),e.slides=i),e.isAnimating=!1,e.updateCursor(),e.trigger("afterShow"),o.opts.video.autoStart&&o.$slide.find("video,audio").filter(":visible:first").trigger("play").one("ended",function(){Document.exitFullscreen?Document.exitFullscreen():this.webkitExitFullscreen&&this.webkitExitFullscreen(),e.next()}),o.opts.autoFocus&&"html"===o.contentType&&(t=o.$content.find("input[autofocus]:enabled:visible:first"),t.length?t.trigger("focus"):e.focus(null,!0)),o.$slide.scrollTop(0).scrollLeft(0))},preload:function(t){var e,n,o=this;o.group.length<2||(n=o.slides[o.currPos+1],e=o.slides[o.currPos-1],e&&e.type===t&&o.loadSlide(e),n&&n.type===t&&o.loadSlide(n))},focus:function(t,o){var i,a,s=this,r=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","video","audio","[contenteditable]",'[tabindex]:not([tabindex^="-"])'].join(",");s.isClosing||(i=!t&&s.current&&s.current.isComplete?s.current.$slide.find("*:visible"+(o?":not(.fancybox-close-small)":"")):s.$refs.container.find("*:visible"),i=i.filter(r).filter(function(){return"hidden"!==n(this).css("visibility")&&!n(this).hasClass("disabled")}),i.length?(a=i.index(e.activeElement),t&&t.shiftKey?(a<0||0==a)&&(t.preventDefault(),i.eq(i.length-1).trigger("focus")):(a<0||a==i.length-1)&&(t&&t.preventDefault(),i.eq(0).trigger("focus"))):s.$refs.container.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,u=this,f=u.current,h=function(){u.cleanUp(t)};return!u.isClosing&&(u.isClosing=!0,!1===u.trigger("beforeClose",t)?(u.isClosing=!1,d(function(){u.update()}),!1):(u.removeEvents(),a=f.$content,o=f.opts.animationEffect,i=!isNaN(parseFloat(i))&&isFinite(i)?e:o?f.opts.animationDuration:0,f.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),!0!==t?n.fancybox.stop(f.$slide):o=!1,f.$slide.siblings().trigger("onReset").remove(),i&&u.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing").css("transition-duration",i+"ms"),u.hideLoading(f),u.hideControls(!0),u.updateCursor(),"zoom"!==o||a&&i&&"image"===f.type&&!u.isMoved()&&!f.hasError&&(l=u.getThumbPos(f))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},
12
+ r=f.opts.zoomOpacity,"auto"==r&&(r=Math.abs(f.width/f.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),p(a),n.fancybox.animate(a,l,i,h),!0):(o&&i?n.fancybox.animate(f.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),"fancybox-animated fancybox-fx-"+o,i,h):!0===t?setTimeout(h,i):h(),!0)))},cleanUp:function(e){var o,i,a,s=this,r=s.current.opts.$orig;s.current.$slide.trigger("onReset"),s.$refs.container.empty().remove(),s.trigger("afterClose",e),s.current.opts.backFocus&&(r&&r.length&&r.is(":visible")||(r=s.$trigger),r&&r.length&&(i=t.scrollX,a=t.scrollY,r.trigger("focus"),n("html, body").scrollTop(a).scrollLeft(i))),s.current=null,o=n.fancybox.getInstance(),o?o.activate():(n("body").removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove())},trigger:function(t,e){var n,o=Array.prototype.slice.call(arguments,1),i=this,a=e&&e.opts?e:i.current;if(a?o.unshift(a):a=i,o.unshift(i),"function"==typeof a.opts[t]&&(n=a.opts[t].apply(a,o)),!1===n)return n;"afterClose"!==t&&i.$refs?i.$refs.container.trigger(t+".fb",o):r.trigger(t+".fb",o)},updateControls:function(){var t=this,o=t.current,i=o.index,a=t.$refs.container,s=t.$refs.caption,r=o.opts.caption;o.$slide.trigger("refresh"),r&&r.length?(t.$caption=s,s.children().eq(0).html(r)):t.$caption=null,t.hasHiddenControls||t.isIdle||t.showControls(),a.find("[data-fancybox-count]").html(t.group.length),a.find("[data-fancybox-index]").html(i+1),a.find("[data-fancybox-prev]").prop("disabled",!o.opts.loop&&i<=0),a.find("[data-fancybox-next]").prop("disabled",!o.opts.loop&&i>=t.group.length-1),"image"===o.type?a.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",o.opts.image.src||o.src).show():o.opts.toolbar&&a.find("[data-fancybox-download],[data-fancybox-zoom]").hide(),n(e.activeElement).is(":hidden,[disabled]")&&t.$refs.container.trigger("focus")},hideControls:function(t){var e=this,n=["infobar","toolbar","nav"];!t&&e.current.opts.preventCaptionOverlap||n.push("caption"),this.$refs.container.removeClass(n.map(function(t){return"fancybox-show-"+t}).join(" ")),this.hasHiddenControls=!0},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.hasHiddenControls=!1,t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-caption",!!t.$caption).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal)},toggleControls:function(){this.hasHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.5.7",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof b&&("string"==typeof t?e[t].apply(e,o):"function"==typeof t&&t.apply(e,o),e)},open:function(t,e,n){return new b(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),!0===t&&this.close(t))},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",o={};if(t&&e)return void 0===e.left&&void 0===e.top||(n=(void 0===e.left?t.position().left:e.left)+"px, "+(void 0===e.top?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),void 0!==e.scaleX&&void 0!==e.scaleY?n+=" scale("+e.scaleX+", "+e.scaleY+")":void 0!==e.scaleX&&(n+=" scaleX("+e.scaleX+")"),n.length&&(o.transform=n),void 0!==e.opacity&&(o.opacity=e.opacity),void 0!==e.width&&(o.width=e.width),void 0!==e.height&&(o.height=e.height),t.css(o)},animate:function(t,e,o,i,a){var s,r=this;"function"==typeof o&&(i=o,o=null),r.stop(t),s=r.getTranslate(t),t.on(f,function(c){(!c||!c.originalEvent||t.is(c.originalEvent.target)&&"z-index"!=c.originalEvent.propertyName)&&(r.stop(t),!isNaN(parseFloat(o))&&isFinite(o)&&t.css("transition-duration",""),n.isPlainObject(e)?void 0!==e.scaleX&&void 0!==e.scaleY&&r.setTranslate(t,{top:e.top,left:e.left,width:s.width*e.scaleX,height:s.height*e.scaleY,scaleX:1,scaleY:1}):!0!==a&&t.removeClass(e),"function"==typeof i&&i(c))}),!isNaN(parseFloat(o))&&isFinite(o)&&t.css("transition-duration",o+"ms"),n.isPlainObject(e)?(void 0!==e.scaleX&&void 0!==e.scaleY&&(delete e.width,delete e.height,t.parent().hasClass("fancybox-slide--image")&&t.parent().addClass("fancybox-is-scaling")),n.fancybox.setTranslate(t,e)):t.addClass(e),t.data("timer",setTimeout(function(){t.trigger(f)},o+33))},stop:function(t,e){t&&t.length&&(clearTimeout(t.data("timer")),e&&t.trigger(f),t.off(f).css("transition-duration",""),t.parent().removeClass("fancybox-is-scaling"))}},n.fn.fancybox=function(t){var e;return t=t||{},e=t.selector||!1,e?n("body").off("click.fb-start",e).on("click.fb-start",e,{options:t},i):this.off("click.fb-start").on("click.fb-start",{items:this,options:t},i),this},r.on("click.fb-start","[data-fancybox]",i),r.on("click.fb-start","[data-fancybox-trigger]",function(t){n('[data-fancybox="'+n(this).attr("data-fancybox-trigger")+'"]').eq(n(this).attr("data-fancybox-index")||0).trigger("click.fb-start",{$trigger:n(this)})}),function(){var t=null;r.on("mousedown mouseup focus blur",".fancybox-button",function(e){switch(e.type){case"mousedown":t=n(this);break;case"mouseup":t=null;break;case"focusin":n(".fancybox-button").removeClass("fancybox-focus"),n(this).is(t)||n(this).is("[disabled]")||n(this).addClass("fancybox-focus");break;case"focusout":n(".fancybox-button").removeClass("fancybox-focus")}})}()}}(window,document,jQuery),function(t){"use strict";var e={youtube:{matcher:/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,params:{autoplay:1,autohide:1,fs:1,rel:0,hd:1,wmode:"transparent",enablejsapi:1,html5:1},paramPlace:8,type:"iframe",url:"https://www.youtube-nocookie.com/embed/$4",thumb:"https://img.youtube.com/vi/$4/hqdefault.jpg"},vimeo:{matcher:/^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,params:{autoplay:1,hd:1,show_title:1,show_byline:1,show_portrait:0,fullscreen:1},paramPlace:3,type:"iframe",url:"//player.vimeo.com/video/$2"},instagram:{matcher:/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,type:"image",url:"//$1/p/$2/media/?size=l"},gmap_place:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/?ll="+(t[9]?t[9]+"&z="+Math.floor(t[10])+(t[12]?t[12].replace(/^\//,"&"):""):t[12]+"").replace(/\?/,"&")+"&output="+(t[12]&&t[12].indexOf("layer=c")>0?"svembed":"embed")}},gmap_search:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/maps?q="+t[5].replace("query=","q=").replace("api=1","")+"&output=embed"}}},n=function(e,n,o){if(e)return o=o||"","object"==typeof o&&(o=t.param(o,!0)),t.each(n,function(t,n){e=e.replace("$"+t,n||"")}),o.length&&(e+=(e.indexOf("?")>0?"&":"?")+o),e};t(document).on("objectNeedsType.fb",function(o,i,a){var s,r,c,l,d,u,f,p=a.src||"",h=!1;s=t.extend(!0,{},e,a.opts.media),t.each(s,function(e,o){if(c=p.match(o.matcher)){if(h=o.type,f=e,u={},o.paramPlace&&c[o.paramPlace]){d=c[o.paramPlace],"?"==d[0]&&(d=d.substring(1)),d=d.split("&");for(var i=0;i<d.length;++i){var s=d[i].split("=",2);2==s.length&&(u[s[0]]=decodeURIComponent(s[1].replace(/\+/g," ")))}}return l=t.extend(!0,{},o.params,a.opts[e],u),p="function"==typeof o.url?o.url.call(this,c,l,a):n(o.url,c,l),r="function"==typeof o.thumb?o.thumb.call(this,c,l,a):n(o.thumb,c),"youtube"===e?p=p.replace(/&t=((\d+)m)?(\d+)s/,function(t,e,n,o){return"&start="+((n?60*parseInt(n,10):0)+parseInt(o,10))}):"vimeo"===e&&(p=p.replace("&%23","#")),!1}}),h?(a.opts.thumb||a.opts.$thumb&&a.opts.$thumb.length||(a.opts.thumb=r),"iframe"===h&&(a.opts=t.extend(!0,a.opts,{iframe:{preload:!1,attr:{scrolling:"no"}}})),t.extend(a,{type:h,src:p,origSrc:a.src,contentSource:f,contentType:"image"===h?"image":"gmap_place"==f||"gmap_search"==f?"map":"video"})):p&&(a.type=a.opts.defaultType)});var o={youtube:{src:"https://www.youtube.com/iframe_api",class:"YT",loading:!1,loaded:!1},vimeo:{src:"https://player.vimeo.com/api/player.js",class:"Vimeo",loading:!1,loaded:!1},load:function(t){var e,n=this;if(this[t].loaded)return void setTimeout(function(){n.done(t)});this[t].loading||(this[t].loading=!0,e=document.createElement("script"),e.type="text/javascript",e.src=this[t].src,"youtube"===t?window.onYouTubeIframeAPIReady=function(){n[t].loaded=!0,n.done(t)}:e.onload=function(){n[t].loaded=!0,n.done(t)},document.body.appendChild(e))},done:function(e){var n,o,i;"youtube"===e&&delete window.onYouTubeIframeAPIReady,(n=t.fancybox.getInstance())&&(o=n.current.$content.find("iframe"),"youtube"===e&&void 0!==YT&&YT?i=new YT.Player(o.attr("id"),{events:{onStateChange:function(t){0==t.data&&n.next()}}}):"vimeo"===e&&void 0!==Vimeo&&Vimeo&&(i=new Vimeo.Player(o),i.on("ended",function(){n.next()})))}};t(document).on({"afterShow.fb":function(t,e,n){e.group.length>1&&("youtube"===n.contentSource||"vimeo"===n.contentSource)&&o.load(n.contentSource)}})}(jQuery),function(t,e,n){"use strict";var o=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),i=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),a=function(e){var n=[];e=e.originalEvent||e||t.e,e=e.touches&&e.touches.length?e.touches:e.changedTouches&&e.changedTouches.length?e.changedTouches:[e];for(var o in e)e[o].pageX?n.push({x:e[o].pageX,y:e[o].pageY}):e[o].clientX&&n.push({x:e[o].clientX,y:e[o].clientY});return n},s=function(t,e,n){return e&&t?"x"===n?t.x-e.x:"y"===n?t.y-e.y:Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)):0},r=function(t){if(t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe')||"function"==typeof t.get(0).onclick||t.data("selectable"))return!0;for(var e=0,n=t[0].attributes,o=n.length;e<o;e++)if("data-fancybox-"===n[e].nodeName.substr(0,14))return!0;return!1},c=function(e){var n=t.getComputedStyle(e)["overflow-y"],o=t.getComputedStyle(e)["overflow-x"],i=("scroll"===n||"auto"===n)&&e.scrollHeight>e.clientHeight,a=("scroll"===o||"auto"===o)&&e.scrollWidth>e.clientWidth;return i||a},l=function(t){for(var e=!1;;){if(e=c(t.get(0)))break;if(t=t.parent(),!t.length||t.hasClass("fancybox-stage")||t.is("body"))break}return e},d=function(t){var e=this;e.instance=t,e.$bg=t.$refs.bg,e.$stage=t.$refs.stage,e.$container=t.$refs.container,e.destroy(),e.$container.on("touchstart.fb.touch mousedown.fb.touch",n.proxy(e,"ontouchstart"))};d.prototype.destroy=function(){var t=this;t.$container.off(".fb.touch"),n(e).off(".fb.touch"),t.requestId&&(i(t.requestId),t.requestId=null),t.tapped&&(clearTimeout(t.tapped),t.tapped=null)},d.prototype.ontouchstart=function(o){var i=this,c=n(o.target),d=i.instance,u=d.current,f=u.$slide,p=u.$content,h="touchstart"==o.type;if(h&&i.$container.off("mousedown.fb.touch"),(!o.originalEvent||2!=o.originalEvent.button)&&f.length&&c.length&&!r(c)&&!r(c.parent())&&(c.is("img")||!(o.originalEvent.clientX>c[0].clientWidth+c.offset().left))){if(!u||d.isAnimating||u.$slide.hasClass("fancybox-animated"))return o.stopPropagation(),void o.preventDefault();i.realPoints=i.startPoints=a(o),i.startPoints.length&&(u.touch&&o.stopPropagation(),i.startEvent=o,i.canTap=!0,i.$target=c,i.$content=p,i.opts=u.opts.touch,i.isPanning=!1,i.isSwiping=!1,i.isZooming=!1,i.isScrolling=!1,i.canPan=d.canPan(),i.startTime=(new Date).getTime(),i.distanceX=i.distanceY=i.distance=0,i.canvasWidth=Math.round(f[0].clientWidth),i.canvasHeight=Math.round(f[0].clientHeight),i.contentLastPos=null,i.contentStartPos=n.fancybox.getTranslate(i.$content)||{top:0,left:0},i.sliderStartPos=n.fancybox.getTranslate(f),i.stagePos=n.fancybox.getTranslate(d.$refs.stage),i.sliderStartPos.top-=i.stagePos.top,i.sliderStartPos.left-=i.stagePos.left,i.contentStartPos.top-=i.stagePos.top,i.contentStartPos.left-=i.stagePos.left,n(e).off(".fb.touch").on(h?"touchend.fb.touch touchcancel.fb.touch":"mouseup.fb.touch mouseleave.fb.touch",n.proxy(i,"ontouchend")).on(h?"touchmove.fb.touch":"mousemove.fb.touch",n.proxy(i,"ontouchmove")),n.fancybox.isMobile&&e.addEventListener("scroll",i.onscroll,!0),((i.opts||i.canPan)&&(c.is(i.$stage)||i.$stage.find(c).length)||(c.is(".fancybox-image")&&o.preventDefault(),n.fancybox.isMobile&&c.parents(".fancybox-caption").length))&&(i.isScrollable=l(c)||l(c.parent()),n.fancybox.isMobile&&i.isScrollable||o.preventDefault(),(1===i.startPoints.length||u.hasError)&&(i.canPan?(n.fancybox.stop(i.$content),i.isPanning=!0):i.isSwiping=!0,i.$container.addClass("fancybox-is-grabbing")),2===i.startPoints.length&&"image"===u.type&&(u.isLoaded||u.$ghost)&&(i.canTap=!1,i.isSwiping=!1,i.isPanning=!1,i.isZooming=!0,n.fancybox.stop(i.$content),i.centerPointStartX=.5*(i.startPoints[0].x+i.startPoints[1].x)-n(t).scrollLeft(),i.centerPointStartY=.5*(i.startPoints[0].y+i.startPoints[1].y)-n(t).scrollTop(),i.percentageOfImageAtPinchPointX=(i.centerPointStartX-i.contentStartPos.left)/i.contentStartPos.width,i.percentageOfImageAtPinchPointY=(i.centerPointStartY-i.contentStartPos.top)/i.contentStartPos.height,i.startDistanceBetweenFingers=s(i.startPoints[0],i.startPoints[1]))))}},d.prototype.onscroll=function(t){var n=this;n.isScrolling=!0,e.removeEventListener("scroll",n.onscroll,!0)},d.prototype.ontouchmove=function(t){var e=this;return void 0!==t.originalEvent.buttons&&0===t.originalEvent.buttons?void e.ontouchend(t):e.isScrolling?void(e.canTap=!1):(e.newPoints=a(t),void((e.opts||e.canPan)&&e.newPoints.length&&e.newPoints.length&&(e.isSwiping&&!0===e.isSwiping||t.preventDefault(),e.distanceX=s(e.newPoints[0],e.startPoints[0],"x"),e.distanceY=s(e.newPoints[0],e.startPoints[0],"y"),e.distance=s(e.newPoints[0],e.startPoints[0]),e.distance>0&&(e.isSwiping?e.onSwipe(t):e.isPanning?e.onPan():e.isZooming&&e.onZoom()))))},d.prototype.onSwipe=function(e){var a,s=this,r=s.instance,c=s.isSwiping,l=s.sliderStartPos.left||0;if(!0!==c)"x"==c&&(s.distanceX>0&&(s.instance.group.length<2||0===s.instance.current.index&&!s.instance.current.opts.loop)?l+=Math.pow(s.distanceX,.8):s.distanceX<0&&(s.instance.group.length<2||s.instance.current.index===s.instance.group.length-1&&!s.instance.current.opts.loop)?l-=Math.pow(-s.distanceX,.8):l+=s.distanceX),s.sliderLastPos={top:"x"==c?0:s.sliderStartPos.top+s.distanceY,left:l},s.requestId&&(i(s.requestId),s.requestId=null),s.requestId=o(function(){s.sliderLastPos&&(n.each(s.instance.slides,function(t,e){var o=e.pos-s.instance.currPos;n.fancybox.setTranslate(e.$slide,{top:s.sliderLastPos.top,left:s.sliderLastPos.left+o*s.canvasWidth+o*e.opts.gutter})}),s.$container.addClass("fancybox-is-sliding"))});else if(Math.abs(s.distance)>10){if(s.canTap=!1,r.group.length<2&&s.opts.vertical?s.isSwiping="y":r.isDragging||!1===s.opts.vertical||"auto"===s.opts.vertical&&n(t).width()>800?s.isSwiping="x":(a=Math.abs(180*Math.atan2(s.distanceY,s.distanceX)/Math.PI),s.isSwiping=a>45&&a<135?"y":"x"),"y"===s.isSwiping&&n.fancybox.isMobile&&s.isScrollable)return void(s.isScrolling=!0);r.isDragging=s.isSwiping,s.startPoints=s.newPoints,n.each(r.slides,function(t,e){var o,i;n.fancybox.stop(e.$slide),o=n.fancybox.getTranslate(e.$slide),i=n.fancybox.getTranslate(r.$refs.stage),e.$slide.css({transform:"",opacity:"","transition-duration":""}).removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")}),e.pos===r.current.pos&&(s.sliderStartPos.top=o.top-i.top,s.sliderStartPos.left=o.left-i.left),n.fancybox.setTranslate(e.$slide,{top:o.top-i.top,left:o.left-i.left})}),r.SlideShow&&r.SlideShow.isActive&&r.SlideShow.stop()}},d.prototype.onPan=function(){var t=this;if(s(t.newPoints[0],t.realPoints[0])<(n.fancybox.isMobile?10:5))return void(t.startPoints=t.newPoints);t.canTap=!1,t.contentLastPos=t.limitMovement(),t.requestId&&i(t.requestId),t.requestId=o(function(){n.fancybox.setTranslate(t.$content,t.contentLastPos)})},d.prototype.limitMovement=function(){var t,e,n,o,i,a,s=this,r=s.canvasWidth,c=s.canvasHeight,l=s.distanceX,d=s.distanceY,u=s.contentStartPos,f=u.left,p=u.top,h=u.width,g=u.height;return i=h>r?f+l:f,a=p+d,t=Math.max(0,.5*r-.5*h),e=Math.max(0,.5*c-.5*g),n=Math.min(r-h,.5*r-.5*h),o=Math.min(c-g,.5*c-.5*g),l>0&&i>t&&(i=t-1+Math.pow(-t+f+l,.8)||0),l<0&&i<n&&(i=n+1-Math.pow(n-f-l,.8)||0),d>0&&a>e&&(a=e-1+Math.pow(-e+p+d,.8)||0),d<0&&a<o&&(a=o+1-Math.pow(o-p-d,.8)||0),{top:a,left:i}},d.prototype.limitPosition=function(t,e,n,o){var i=this,a=i.canvasWidth,s=i.canvasHeight;return n>a?(t=t>0?0:t,t=t<a-n?a-n:t):t=Math.max(0,a/2-n/2),o>s?(e=e>0?0:e,e=e<s-o?s-o:e):e=Math.max(0,s/2-o/2),{top:e,left:t}},d.prototype.onZoom=function(){var e=this,a=e.contentStartPos,r=a.width,c=a.height,l=a.left,d=a.top,u=s(e.newPoints[0],e.newPoints[1]),f=u/e.startDistanceBetweenFingers,p=Math.floor(r*f),h=Math.floor(c*f),g=(r-p)*e.percentageOfImageAtPinchPointX,b=(c-h)*e.percentageOfImageAtPinchPointY,m=(e.newPoints[0].x+e.newPoints[1].x)/2-n(t).scrollLeft(),v=(e.newPoints[0].y+e.newPoints[1].y)/2-n(t).scrollTop(),y=m-e.centerPointStartX,x=v-e.centerPointStartY,w=l+(g+y),$=d+(b+x),S={top:$,left:w,scaleX:f,scaleY:f};e.canTap=!1,e.newWidth=p,e.newHeight=h,e.contentLastPos=S,e.requestId&&i(e.requestId),e.requestId=o(function(){n.fancybox.setTranslate(e.$content,e.contentLastPos)})},d.prototype.ontouchend=function(t){var o=this,s=o.isSwiping,r=o.isPanning,c=o.isZooming,l=o.isScrolling;if(o.endPoints=a(t),o.dMs=Math.max((new Date).getTime()-o.startTime,1),o.$container.removeClass("fancybox-is-grabbing"),n(e).off(".fb.touch"),e.removeEventListener("scroll",o.onscroll,!0),o.requestId&&(i(o.requestId),o.requestId=null),o.isSwiping=!1,o.isPanning=!1,o.isZooming=!1,o.isScrolling=!1,o.instance.isDragging=!1,o.canTap)return o.onTap(t);o.speed=100,o.velocityX=o.distanceX/o.dMs*.5,o.velocityY=o.distanceY/o.dMs*.5,r?o.endPanning():c?o.endZooming():o.endSwiping(s,l)},d.prototype.endSwiping=function(t,e){var o=this,i=!1,a=o.instance.group.length,s=Math.abs(o.distanceX),r="x"==t&&a>1&&(o.dMs>130&&s>10||s>50);o.sliderLastPos=null,"y"==t&&!e&&Math.abs(o.distanceY)>50?(n.fancybox.animate(o.instance.current.$slide,{top:o.sliderStartPos.top+o.distanceY+150*o.velocityY,opacity:0},200),i=o.instance.close(!0,250)):r&&o.distanceX>0?i=o.instance.previous(300):r&&o.distanceX<0&&(i=o.instance.next(300)),!1!==i||"x"!=t&&"y"!=t||o.instance.centerSlide(200),o.$container.removeClass("fancybox-is-sliding")},d.prototype.endPanning=function(){var t,e,o,i=this;i.contentLastPos&&(!1===i.opts.momentum||i.dMs>350?(t=i.contentLastPos.left,e=i.contentLastPos.top):(t=i.contentLastPos.left+500*i.velocityX,e=i.contentLastPos.top+500*i.velocityY),o=i.limitPosition(t,e,i.contentStartPos.width,i.contentStartPos.height),o.width=i.contentStartPos.width,o.height=i.contentStartPos.height,n.fancybox.animate(i.$content,o,366))},d.prototype.endZooming=function(){var t,e,o,i,a=this,s=a.instance.current,r=a.newWidth,c=a.newHeight;a.contentLastPos&&(t=a.contentLastPos.left,e=a.contentLastPos.top,i={top:e,left:t,width:r,height:c,scaleX:1,scaleY:1},n.fancybox.setTranslate(a.$content,i),r<a.canvasWidth&&c<a.canvasHeight?a.instance.scaleToFit(150):r>s.width||c>s.height?a.instance.scaleToActual(a.centerPointStartX,a.centerPointStartY,150):(o=a.limitPosition(t,e,r,c),n.fancybox.animate(a.$content,o,150)))},d.prototype.onTap=function(e){var o,i=this,s=n(e.target),r=i.instance,c=r.current,l=e&&a(e)||i.startPoints,d=l[0]?l[0].x-n(t).scrollLeft()-i.stagePos.left:0,u=l[0]?l[0].y-n(t).scrollTop()-i.stagePos.top:0,f=function(t){var n=c.opts[t];if("function"==typeof n&&(n=n.apply(r,[c,e])),n)switch(n){case"close":r.close(i.startEvent);break;case"toggleControls":r.toggleControls();break;case"next":r.next();break;case"nextOrClose":r.group.length>1?r.next():r.close(i.startEvent);break;case"zoom":"image"==c.type&&(c.isLoaded||c.$ghost)&&(r.canPan()?r.scaleToFit():r.isScaledDown()?r.scaleToActual(d,u):r.group.length<2&&r.close(i.startEvent))}};if((!e.originalEvent||2!=e.originalEvent.button)&&(s.is("img")||!(d>s[0].clientWidth+s.offset().left))){if(s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container"))o="Outside";else if(s.is(".fancybox-slide"))o="Slide";else{if(!r.current.$content||!r.current.$content.find(s).addBack().filter(s).length)return;o="Content"}if(i.tapped){if(clearTimeout(i.tapped),i.tapped=null,Math.abs(d-i.tapX)>50||Math.abs(u-i.tapY)>50)return this;f("dblclick"+o)}else i.tapX=d,i.tapY=u,c.opts["dblclick"+o]&&c.opts["dblclick"+o]!==c.opts["click"+o]?i.tapped=setTimeout(function(){i.tapped=null,r.isAnimating||f("click"+o)},500):f("click"+o);return this}},n(e).on("onActivate.fb",function(t,e){e&&!e.Guestures&&(e.Guestures=new d(e))}).on("beforeClose.fb",function(t,e){e&&e.Guestures&&e.Guestures.destroy()})}(window,document,jQuery),function(t,e){"use strict";e.extend(!0,e.fancybox.defaults,{btnTpl:{slideShow:'<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg></button>'},slideShow:{autoStart:!1,speed:3e3,progress:!0}});var n=function(t){this.instance=t,this.init()};e.extend(n.prototype,{timer:null,isActive:!1,$button:null,init:function(){var t=this,n=t.instance,o=n.group[n.currIndex].opts.slideShow;t.$button=n.$refs.toolbar.find("[data-fancybox-play]").on("click",function(){t.toggle()}),n.group.length<2||!o?t.$button.hide():o.progress&&(t.$progress=e('<div class="fancybox-progress"></div>').appendTo(n.$refs.inner))},set:function(t){var n=this,o=n.instance,i=o.current;i&&(!0===t||i.opts.loop||o.currIndex<o.group.length-1)?n.isActive&&"video"!==i.contentType&&(n.$progress&&e.fancybox.animate(n.$progress.show(),{scaleX:1},i.opts.slideShow.speed),n.timer=setTimeout(function(){o.current.opts.loop||o.current.index!=o.group.length-1?o.next():o.jumpTo(0)},i.opts.slideShow.speed)):(n.stop(),o.idleSecondsCounter=0,o.showControls())},clear:function(){var t=this;clearTimeout(t.timer),t.timer=null,t.$progress&&t.$progress.removeAttr("style").hide()},start:function(){var t=this,e=t.instance.current;e&&(t.$button.attr("title",(e.opts.i18n[e.opts.lang]||e.opts.i18n.en).PLAY_STOP).removeClass("fancybox-button--play").addClass("fancybox-button--pause"),t.isActive=!0,e.isComplete&&t.set(!0),t.instance.trigger("onSlideShowChange",!0))},stop:function(){var t=this,e=t.instance.current;t.clear(),t.$button.attr("title",(e.opts.i18n[e.opts.lang]||e.opts.i18n.en).PLAY_START).removeClass("fancybox-button--pause").addClass("fancybox-button--play"),t.isActive=!1,t.instance.trigger("onSlideShowChange",!1),t.$progress&&t.$progress.removeAttr("style").hide()},toggle:function(){var t=this;t.isActive?t.stop():t.start()}}),e(t).on({"onInit.fb":function(t,e){e&&!e.SlideShow&&(e.SlideShow=new n(e))},"beforeShow.fb":function(t,e,n,o){var i=e&&e.SlideShow;o?i&&n.opts.slideShow.autoStart&&i.start():i&&i.isActive&&i.clear()},"afterShow.fb":function(t,e,n){var o=e&&e.SlideShow;o&&o.isActive&&o.set()},"afterKeydown.fb":function(n,o,i,a,s){var r=o&&o.SlideShow;!r||!i.opts.slideShow||80!==s&&32!==s||e(t.activeElement).is("button,a,input")||(a.preventDefault(),r.toggle())},"beforeClose.fb onDeactivate.fb":function(t,e){var n=e&&e.SlideShow;n&&n.stop()}}),e(t).on("visibilitychange",function(){var n=e.fancybox.getInstance(),o=n&&n.SlideShow;o&&o.isActive&&(t.hidden?o.clear():o.set())})}(document,jQuery),function(t,e){"use strict";var n=function(){for(var e=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],n={},o=0;o<e.length;o++){var i=e[o];if(i&&i[1]in t){for(var a=0;a<i.length;a++)n[e[0][a]]=i[a];return n}}return!1}();if(n){var o={request:function(e){e=e||t.documentElement,e[n.requestFullscreen](e.ALLOW_KEYBOARD_INPUT)},exit:function(){t[n.exitFullscreen]()},toggle:function(e){e=e||t.documentElement,this.isFullscreen()?this.exit():this.request(e)},isFullscreen:function(){return Boolean(t[n.fullscreenElement])},enabled:function(){return Boolean(t[n.fullscreenEnabled])}};e.extend(!0,e.fancybox.defaults,{btnTpl:{fullScreen:'<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fsenter" title="{{FULL_SCREEN}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"/></svg></button>'},fullScreen:{autoStart:!1}}),e(t).on(n.fullscreenchange,function(){var t=o.isFullscreen(),n=e.fancybox.getInstance();n&&(n.current&&"image"===n.current.type&&n.isAnimating&&(n.isAnimating=!1,n.update(!0,!0,0),n.isComplete||n.complete()),n.trigger("onFullscreenChange",t),n.$refs.container.toggleClass("fancybox-is-fullscreen",t),n.$refs.toolbar.find("[data-fancybox-fullscreen]").toggleClass("fancybox-button--fsenter",!t).toggleClass("fancybox-button--fsexit",t))})}e(t).on({"onInit.fb":function(t,e){var i;if(!n)return void e.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();e&&e.group[e.currIndex].opts.fullScreen?(i=e.$refs.container,i.on("click.fb-fullscreen","[data-fancybox-fullscreen]",function(t){t.stopPropagation(),t.preventDefault(),o.toggle()}),e.opts.fullScreen&&!0===e.opts.fullScreen.autoStart&&o.request(),e.FullScreen=o):e&&e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide()},"afterKeydown.fb":function(t,e,n,o,i){e&&e.FullScreen&&70===i&&(o.preventDefault(),e.FullScreen.toggle())},"beforeClose.fb":function(t,e){e&&e.FullScreen&&e.$refs.container.hasClass("fancybox-is-fullscreen")&&o.exit()}})}(document,jQuery),function(t,e){"use strict";var n="fancybox-thumbs";e.fancybox.defaults=e.extend(!0,{btnTpl:{thumbs:'<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.59 14.59h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76H5.65V5.65z"/></svg></button>'},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"}},e.fancybox.defaults);var o=function(t){this.init(t)};e.extend(o.prototype,{$button:null,$grid:null,$list:null,isVisible:!1,isActive:!1,init:function(t){var e=this,n=t.group,o=0;e.instance=t,e.opts=n[t.currIndex].opts.thumbs,t.Thumbs=e,e.$button=t.$refs.toolbar.find("[data-fancybox-thumbs]");for(var i=0,a=n.length;i<a&&(n[i].thumb&&o++,!(o>1));i++);o>1&&e.opts?(e.$button.removeAttr("style").on("click",function(){e.toggle()}),e.isActive=!0):e.$button.hide()},create:function(){var t,o=this,i=o.instance,a=o.opts.parentEl,s=[];o.$grid||(o.$grid=e('<div class="'+n+" "+n+"-"+o.opts.axis+'"></div>').appendTo(i.$refs.container.find(a).addBack().filter(a)),o.$grid.on("click","a",function(){i.jumpTo(e(this).attr("data-index"))})),o.$list||(o.$list=e('<div class="'+n+'__list">').appendTo(o.$grid)),e.each(i.group,function(e,n){t=n.thumb,t||"image"!==n.type||(t=n.src),s.push('<a href="javascript:;" tabindex="0" data-index="'+e+'"'+(t&&t.length?' style="background-image:url('+t+')"':'class="fancybox-thumbs-missing"')+"></a>")}),o.$list[0].innerHTML=s.join(""),"x"===o.opts.axis&&o.$list.width(parseInt(o.$grid.css("padding-right"),10)+i.group.length*o.$list.children().eq(0).outerWidth(!0))},focus:function(t){var e,n,o=this,i=o.$list,a=o.$grid;o.instance.current&&(e=i.children().removeClass("fancybox-thumbs-active").filter('[data-index="'+o.instance.current.index+'"]').addClass("fancybox-thumbs-active"),n=e.position(),"y"===o.opts.axis&&(n.top<0||n.top>i.height()-e.outerHeight())?i.stop().animate({scrollTop:i.scrollTop()+n.top},t):"x"===o.opts.axis&&(n.left<a.scrollLeft()||n.left>a.scrollLeft()+(a.width()-e.outerWidth()))&&i.parent().stop().animate({scrollLeft:n.left},t))},update:function(){var t=this;t.instance.$refs.container.toggleClass("fancybox-show-thumbs",this.isVisible),t.isVisible?(t.$grid||t.create(),t.instance.trigger("onThumbsShow"),t.focus(0)):t.$grid&&t.instance.trigger("onThumbsHide"),t.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible=!this.isVisible,this.update()}}),e(t).on({"onInit.fb":function(t,e){var n;e&&!e.Thumbs&&(n=new o(e),n.isActive&&!0===n.opts.autoStart&&n.show())},"beforeShow.fb":function(t,e,n,o){var i=e&&e.Thumbs;i&&i.isVisible&&i.focus(o?0:250)},"afterKeydown.fb":function(t,e,n,o,i){var a=e&&e.Thumbs;a&&a.isActive&&71===i&&(o.preventDefault(),a.toggle())},"beforeClose.fb":function(t,e){var n=e&&e.Thumbs;n&&n.isVisible&&!1!==n.opts.hideOnClose&&n.$grid.hide()}})}(document,jQuery),function(t,e,n){"use strict";function o(){var e=t.location.hash.substr(1),n=e.split("-"),o=n.length>1&&/^\+?\d+$/.test(n[n.length-1])?parseInt(n.pop(-1),10)||1:1,i=n.join("-");return{hash:e,index:o<1?1:o,gallery:i}}function i(t){""!==t.gallery&&n("[data-fancybox='"+n.escapeSelector(t.gallery)+"']").eq(t.index-1).focus().trigger("click.fb-start")}function a(t){var e,n;return!!t&&(e=t.current?t.current.opts:t.opts,""!==(n=e.hash||(e.$orig?e.$orig.data("fancybox")||e.$orig.data("fancybox-trigger"):""))&&n)}n.escapeSelector||(n.escapeSelector=function(t){return(t+"").replace(/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t})}),n(function(){!1!==n.fancybox.defaults.hash&&(n(e).on({"onInit.fb":function(t,e){var n,i;!1!==e.group[e.currIndex].opts.hash&&(n=o(),(i=a(e))&&n.gallery&&i==n.gallery&&(e.currIndex=n.index-1))},"beforeShow.fb":function(n,o,i,s){var r;i&&!1!==i.opts.hash&&(r=a(o))&&(o.currentHash=r+(o.group.length>1?"-"+(i.index+1):""),t.location.hash!=="#"+o.currentHash&&(s&&!o.origHash&&(o.origHash=t.location.hash),o.hashTimer&&clearTimeout(o.hashTimer),o.hashTimer=setTimeout(function(){"replaceState"in t.history?(t.history[s?"pushState":"replaceState"]({},e.title,t.location.pathname+t.location.search+"#"+o.currentHash),s&&(o.hasCreatedHistory=!0)):t.location.hash=o.currentHash,o.hashTimer=null},300)))},"beforeClose.fb":function(n,o,i){i&&!1!==i.opts.hash&&(clearTimeout(o.hashTimer),
13
+ o.currentHash&&o.hasCreatedHistory?t.history.back():o.currentHash&&("replaceState"in t.history?t.history.replaceState({},e.title,t.location.pathname+t.location.search+(o.origHash||"")):t.location.hash=o.origHash),o.currentHash=null)}}),n(t).on("hashchange.fb",function(){var t=o(),e=null;n.each(n(".fancybox-container").get().reverse(),function(t,o){var i=n(o).data("FancyBox");if(i&&i.currentHash)return e=i,!1}),e?e.currentHash===t.gallery+"-"+t.index||1===t.index&&e.currentHash==t.gallery||(e.currentHash=null,e.close()):""!==t.gallery&&i(t)}),setTimeout(function(){n.fancybox.getInstance()||i(o())},50))})}(window,document,jQuery),function(t,e){"use strict";var n=(new Date).getTime();e(t).on({"onInit.fb":function(t,e,o){e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll",function(t){var o=e.current,i=(new Date).getTime();e.group.length<2||!1===o.opts.wheel||"auto"===o.opts.wheel&&"image"!==o.type||(t.preventDefault(),t.stopPropagation(),o.$slide.hasClass("fancybox-animated")||(t=t.originalEvent||t,i-n<250||(n=i,e[(-t.deltaY||-t.deltaX||t.wheelDelta||-t.detail)<0?"next":"previous"]())))})}})}(document,jQuery);
14
 
15
  var fv_player_fancybox_paused_players = {};
16
 
40
  return '';
41
  }
42
 
43
+ // Fancybox defaults
44
  jQuery.fancybox.defaults.smallBtn = false;
45
  jQuery.fancybox.defaults.toolbar = true;
46
  jQuery.fancybox.defaults.thumbs.hideOnClose = false;
47
  jQuery.fancybox.defaults.caption = fv_player_colorbox_title;
48
  jQuery.fancybox.defaults.afterLoad = fv_fancybox_check_size;
49
+ jQuery.fancybox.defaults.hash = false;
50
+ jQuery.fancybox.defaults.buttons = ["slideShow","fullScreen","thumbs","close"];
51
+
52
+ jQuery.fancybox.defaults.onThumbsShow = function() {
53
  jQuery(jQuery.fancybox.getInstance().group).each( function(k,v) {
54
  if( v.src.match(/^#wpfp_/) ) {
55
  jQuery('.fancybox-thumbs li[data-index='+k+']').append('<span class="fv-player-fancybox-play-icon">&#9654;</span>');
59
  }
60
  })
61
  }
62
+
63
+ // click on image will toggle controls
64
+ jQuery.fancybox.defaults.clickContent = function(current, event) {
65
+ return current.type === "image" ? "toggleControls" : false;
66
+ };
67
+
68
+ // double click will zoom image
69
+ jQuery.fancybox.defaults.dblclickContent = function(current, event) {
70
+ return current.type === "image" ? "zoom" : false;
71
+ };
72
 
73
  jQuery(document).ready(function() {
74
  jQuery(".colorbox[href^='#']:not([data-cbox-inline]), .lightbox[href^='#']").filter(function () {
170
  return;
171
  }
172
 
173
+ if( e.type == 'afterShow' && api.lightbox_visible() ) return;
174
 
175
+ // if this player was previously paused on fancybox show and it's the currently visible lightbox item, unpause it
176
+ if ( typeof( fv_player_fancybox_paused_players[ player_id ] ) != 'undefined' && api.lightbox_visible() ) {
177
  was_paused = true;
178
  delete fv_player_fancybox_paused_players[ $e.attr('id') ];
179
  api.resume();
185
  }
186
 
187
  if( api.loading ) {
188
+ api.one('ready',function() {
189
  if ( api.engine.engineName === 'fvyoutube' && api.playing && !was_paused ) {
190
  fv_player_fancybox_paused_players[ $e.attr('id') ] = 1;
191
  api.pause();
197
 
198
  jQuery(document).on('afterShow.fb afterClose.fb', fv_lightbox_flowplayer_shutdown);
199
 
200
+ jQuery(window).on( "resize", fv_fancybox_check_size);
201
 
202
  if( document.addEventListener ) {
203
  var fv_orientation_change_timer = -1;
219
  jQuery( function() {
220
  if( typeof(flowplayer) != "undefined" ) {
221
  flowplayer( function(api,root) {
222
+ root = jQuery(root);
223
+
224
+ var lightbox_wrap = root.closest('.fv_player_lightbox_hidden'),
225
+ player = '#' + root.attr('id') + '_container';
226
+
227
+ /**
228
+ * Check if player is lightboxed
229
+ *
230
+ * @returns int
231
+ */
232
+ api.is_in_lightbox = function() {
233
+ return lightbox_wrap.length;
234
+ };
235
+
236
+ /**
237
+ * Check if lightbox is visible
238
+ *
239
+ * @returns int
240
+ */
241
+ api.lightbox_visible = function() {
242
+ return root.closest('.fancybox-slide--current').length;
243
+ };
244
+
245
+ if( api.is_in_lightbox() ) {
246
  lightbox_wrap.on('click', function(e) {
247
  if( e.target == e.currentTarget) {
248
  jQuery.fancybox.close();
265
  if( fancybox_thumbs ) jQuery('.fancybox-container').addClass('fancybox-show-thumbs');
266
  });
267
  }
268
+
269
+ // show lightbox if the player is started by some other way than clicking on the lightbox button - like chapter name
270
+ api.on('load resume', function (e,api,time) {
271
+ if( !api.lightbox_visible() ) {
272
+ jQuery.fancybox.open(jQuery(player))
273
+ fv_fancybox_check_size();
274
+ }
275
+ });
276
  }
277
  });
278
  }
330
  } else {
331
  api.play(index);
332
  }
333
+ fv_fancybox_check_size();
334
 
335
  if( playlist.length && !jQuery(this).data('fancybox') ) {
336
  playlist.find('a[data-fancybox]').eq(0).click();
js/linode-object-storage.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery( function($) {
2
+
3
+ function fv_flowplayer_linode_object_storage_browser_load_assets(bucket, path) {
4
+ var
5
+ $this = jQuery(this),
6
+ $media_frame_content = jQuery('.media-frame-content:visible'),
7
+ $overlay_div = jQuery('#fv-player-shortcode-editor-preview-spinner').clone().css({
8
+ 'height': '100%'
9
+ }),
10
+ ajax_data = {
11
+ action: "load_linode_object_storage_assets",
12
+ };
13
+
14
+ $this.addClass('active').siblings().removeClass('active');
15
+
16
+ $media_frame_content.html($overlay_div);
17
+
18
+ if (typeof bucket === 'string' && bucket) {
19
+ ajax_data['bucket'] = bucket;
20
+ }
21
+ if (typeof path === 'string' && path) {
22
+ ajax_data['path'] = path;
23
+ }
24
+
25
+ jQuery.post(ajaxurl, ajax_data, function (ret) {
26
+ var renderOptions = {};
27
+
28
+ // add errors, if any
29
+ if (ret.err) {
30
+ renderOptions['errorMsg'] = ret.err;
31
+ }
32
+
33
+ $media_frame_content.html(renderBrowserPlaceholderHTML(renderOptions));
34
+
35
+ jQuery('#media-search-input').parent().hide();
36
+
37
+ fv_flowplayer_browser_browse(ret.items, { 'breadcrumbs' : 1 });
38
+ });
39
+
40
+ return false;
41
+ };
42
+
43
+ $(document).on("mediaBrowserOpen", function (event) {
44
+ fv_flowplayer_media_browser_add_tab('fv_flowplayer_linode_object_storage_browser_media_tab', 'Linode Object Storage', fv_flowplayer_linode_object_storage_browser_load_assets);
45
+ });
46
+ });
js/media-library-browser-base.js CHANGED
@@ -1,10 +1,21 @@
1
  var
2
  fv_flowplayer_scannedFolders = [],
3
  fv_flowplayer_scannedFiles = [],
 
 
4
  // object where key->value pairs represent tabId->ajaxAssetsLoadingScript pairs
5
  // ... we use this to load assets (media files) from SDK of the correct browser integration
6
  // depending on which tab is currently active
7
- fv_flowplayer_browser_assets_loaders = {};
 
 
 
 
 
 
 
 
 
8
 
9
  // this thumbnail sizing functionality originally comes from WP JS
10
  function fv_flowplayer_media_browser_setColumns() {
@@ -20,6 +31,10 @@ function fv_flowplayer_media_browser_setColumns() {
20
  }
21
  }
22
 
 
 
 
 
23
  function fv_flowplayer_browser_add_load_more_button($fileListUl, loadMoreButtonAction) {
24
  $fileListUl.append('<li tabindex="0" class="attachment" id="overlay-loader-li"></li>');
25
  var $moreDiv = jQuery('<div class="attachment-preview"><div class="loadmore"></div></div>');
@@ -124,7 +139,7 @@ function fv_flowplayer_browser_browse(data, options) {
124
  fv_flowplayer_scannedFolders.forEach(function(f) {
125
  var name = escapeHTML(f.name).replace(/\/$/,'');
126
  fileList.append( jQuery(
127
- '<li class="folders attachment save-ready' + ( f.disabled ? ' disabled' : '' ) + '">'
128
  + '<div class="attachment-preview js--select-attachment type-video subtype-mp4 landscape">'
129
  + '<div class="thumbnail">'
130
  + '<a href="' + f.path + '" title="' + name + '" class="folders">'
@@ -146,7 +161,7 @@ function fv_flowplayer_browser_browse(data, options) {
146
 
147
  var
148
  name = escapeHTML(f.name),
149
- file = jQuery('<li tabindex="0" role="checkbox" aria-label="' + name + '" aria-checked="false" class="folders attachment save-ready' + ( f.disabled ? ' disabled' : '' ) + '"></li>'),
150
  isPicture = name.match(/\.(jpg|jpeg|png|gif)$/),
151
  icon = '';
152
 
@@ -168,7 +183,7 @@ function fv_flowplayer_browser_browse(data, options) {
168
  if ( f.extra.percentage ) {
169
  var percentage = f.extra.percentage;
170
  if( parseInt(percentage) < 5 ) percentage = 5+'%';
171
- progress += '<div class="thumbnail-status">Processing</div><div class="thumbnail-progress"><div class="thumbnail-progress-marker" style="width: '+percentage+'"></div></div>';
172
  } else {
173
  progress += '<div class="thumbnail-status-error">Error</div>';
174
  }
@@ -237,7 +252,9 @@ function fv_flowplayer_browser_browse(data, options) {
237
 
238
  // adds new tab on top of the Media Library popup
239
  function fv_flowplayer_media_browser_add_tab(tabId, tabText, tabOnClickCallback, tabAddedCallback, tabClickEventCallback) {
240
- if (!jQuery('#' + tabId).length) {
 
 
241
  var
242
  $router = jQuery('.media-router:visible'),
243
  $nativeTabs = $router.find('.media-menu-item:not(.artificial)'),
@@ -292,16 +309,14 @@ function fv_flowplayer_media_browser_add_tab(tabId, tabText, tabOnClickCallback,
292
  .text(tabText)
293
  .addClass('artificial')
294
  .on('click', function() {
295
-
296
- fv_flowplayer_media_browser_disable_drag_drop(true);
297
-
298
- fv_flowplayer_media_browser_show_upload( jQuery(this).attr('id') );
299
-
300
  // disable Choose button
301
  jQuery('.media-button-select').prop('disabled', 'disabled');
302
  $router.find('.media-menu-item.active').removeClass('active');
303
  jQuery(this).addClass('active');
304
 
 
 
 
305
  // execute tab click function
306
  if (typeof(tabClickEventCallback) == 'function' && !switchClicking) {
307
  tabClickEventCallback();
@@ -314,6 +329,12 @@ function fv_flowplayer_media_browser_add_tab(tabId, tabText, tabOnClickCallback,
314
  }
315
  } catch(e) {}
316
 
 
 
 
 
 
 
317
  return tabOnClickCallback();
318
  });
319
 
@@ -325,6 +346,7 @@ function fv_flowplayer_media_browser_add_tab(tabId, tabText, tabOnClickCallback,
325
  tabAddedCallback($item);
326
  }
327
 
 
328
  }
329
 
330
  // if this tab was the last active, make it active again
@@ -337,34 +359,55 @@ function fv_flowplayer_media_browser_add_tab(tabId, tabText, tabOnClickCallback,
337
  }, 500);
338
  }
339
  } catch(e) {}
 
 
340
  };
341
 
342
  /*
343
  * Disable/enable core WordPress drag&drop uploader
344
  */
345
  function fv_flowplayer_media_browser_disable_drag_drop( disable ) {
346
- var overlay = jQuery('.media-frame-uploader')
347
- overlay_content = jQuery('.uploader-window'),
348
- drop_targets = jQuery('[id^=__wp-uploader-id-');
 
 
349
 
350
  if( disable ) {
351
  drop_targets.off('drop', fv_flowplayer_media_browser_disable_drag_drop_worker );
352
  drop_targets.on('drop', fv_flowplayer_media_browser_disable_drag_drop_worker );
353
 
354
- overlay.css('opacity', 0 );
 
 
 
 
355
 
356
  } else {
357
  drop_targets.off('drop', fv_flowplayer_media_browser_disable_drag_drop_worker );
358
 
359
- overlay.css('opacity', '' );
360
-
361
- // We need to hide this now as WordPress did make it visible at some point
362
- overlay_content.css('display', 'none' );
363
- overlay_content.css('opacity', '0' );
 
 
 
 
 
 
 
 
 
 
364
  }
365
  }
366
 
367
- function fv_flowplayer_media_browser_disable_drag_drop_worker() {
 
 
 
368
  return false;
369
  }
370
 
@@ -458,8 +501,8 @@ jQuery( function($) {
458
  function locateSplashFileObjectForMediaFileHref(href) {
459
  var find = [ fileGetBase(href) ];
460
 
461
- if( window.fv_player_shortcode_editor_qualities ) {
462
- Object.keys(fv_player_shortcode_editor_qualities).forEach( function(prefix) {
463
  var re = new RegExp(prefix+'$');
464
  if( find[0].match(re) ) {
465
  find.push( find[0].replace(re,'') );
@@ -467,21 +510,48 @@ jQuery( function($) {
467
  });
468
  }
469
 
470
- var splash = false;
 
 
471
 
472
  for( var i in find ) {
473
  for( var j in fv_flowplayer_scannedFiles ) {
474
- var f = fv_flowplayer_scannedFiles[j];
475
- if (
476
- // image splash files with the same base name that are not poining to the same actual file
477
  // as the one we're checking them against (classic splash files)
478
- ( f && f.link && f.link.match(/\.(jpg|jpeg|png|gif)$/) && fileGetBase(f.link) == find[i] && f.link != href )
479
- ||
480
- // m3u8 splash files that actually point to the same file as the one we're checking them against
481
- // but have a splash image under a specific object key (such as Coconut thumbnails with different sizes
482
- // used as splash screens and small Media Library thumbnails)
483
- ( f && f.link && f.link.match(/\.(m3u8)$/) && fileGetBase(f.link) == find[i] )
484
- ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
  splash = f;
486
  }
487
  }
@@ -515,11 +585,12 @@ jQuery( function($) {
515
  splash_name = 'splash';
516
  }
517
 
518
- splash = file[ splash_name ];
 
519
 
520
  // we remove the signature when we're updating the Editor field, otherwise we leave it in,
521
  // so we can actually preview the splash
522
- if (typeof( strip_signature ) != 'undefined' && strip_signature && splash.indexOf('?') > -1) {
523
  splash = splash.substring(0, splash.indexOf('?'));
524
  }
525
 
@@ -636,9 +707,9 @@ jQuery( function($) {
636
  fSize = parseInt($filenameDiv.data('size')),
637
  fSizeTextual = fSize != $filenameDiv.data('size'),
638
  fDuration = parseInt($filenameDiv.data('duration')),
 
639
  fExtraDisplayData = $filenameDiv.data('extra');
640
  fExtraDisplayData = fExtraDisplayData.displayData;
641
- sizeSuffix = 'bytes';
642
 
643
  if (!fSizeTextual) {
644
  // if filesize is too small, show it in KBytes
@@ -728,8 +799,8 @@ jQuery( function($) {
728
  '\t\t' + ( ($filenameDiv.data('extra') != 'undefined' && $filenameDiv.data('extra').trailer_src != undefined ) ? '<button type="button" class="button media-button trailer-button-select">Select Trailer</button>' : '' ) +
729
  '\t</div>');
730
 
731
- // if this item is unselectable (i.e. a Coconut job that errored-out), disable the Choose button
732
- if ( $e.hasClass('disabled') ) {
733
  jQuery('.media-button-select').prop('disabled', 'disabled');
734
  } else {
735
  // enable Choose button
@@ -784,4 +855,15 @@ jQuery( function($) {
784
  return false;
785
  });
786
 
 
 
 
 
 
 
 
 
 
 
 
787
  });
1
  var
2
  fv_flowplayer_scannedFolders = [],
3
  fv_flowplayer_scannedFiles = [],
4
+
5
+ // TODO: Use some public method instead
6
  // object where key->value pairs represent tabId->ajaxAssetsLoadingScript pairs
7
  // ... we use this to load assets (media files) from SDK of the correct browser integration
8
  // depending on which tab is currently active
9
+ fv_flowplayer_browser_assets_loaders = {},
10
+
11
+ // TODO: Use some public method instead
12
+ // the following will contain file patterns which will be checked when determining whether we can automatically find
13
+ // a splash screen for a video file in any given browser
14
+ //
15
+ // ... for example, Coconut uses m3u8 files with the same file name as its encoded file names for thumbnails,
16
+ // so it will need to create an inclusion rule like so:
17
+ // fv_flowplayer_browser_splash_file_lookup_rules['fv_player_coconut_browser_media_tab']['include'] = ['\.(m3u8)$']
18
+ fv_flowplayer_browser_splash_file_lookup_rules = {};
19
 
20
  // this thumbnail sizing functionality originally comes from WP JS
21
  function fv_flowplayer_media_browser_setColumns() {
31
  }
32
  }
33
 
34
+ function fv_player_get_active_tab() {
35
+ return jQuery( '.media-menu-item.active:visible' );
36
+ }
37
+
38
  function fv_flowplayer_browser_add_load_more_button($fileListUl, loadMoreButtonAction) {
39
  $fileListUl.append('<li tabindex="0" class="attachment" id="overlay-loader-li"></li>');
40
  var $moreDiv = jQuery('<div class="attachment-preview"><div class="loadmore"></div></div>');
139
  fv_flowplayer_scannedFolders.forEach(function(f) {
140
  var name = escapeHTML(f.name).replace(/\/$/,'');
141
  fileList.append( jQuery(
142
+ '<li class="folders attachment save-ready">'
143
  + '<div class="attachment-preview js--select-attachment type-video subtype-mp4 landscape">'
144
  + '<div class="thumbnail">'
145
  + '<a href="' + f.path + '" title="' + name + '" class="folders">'
161
 
162
  var
163
  name = escapeHTML(f.name),
164
+ file = jQuery('<li tabindex="0" role="checkbox" aria-label="' + name + '" aria-checked="false" class="folders attachment save-ready"></li>'),
165
  isPicture = name.match(/\.(jpg|jpeg|png|gif)$/),
166
  icon = '';
167
 
183
  if ( f.extra.percentage ) {
184
  var percentage = f.extra.percentage;
185
  if( parseInt(percentage) < 5 ) percentage = 5+'%';
186
+ progress += '<div class="thumbnail-status">' + ( f.extra.encoding_job_status == 'playable' ? 'Playable' : 'Processing' ) + '</div><div class="thumbnail-progress"><div class="thumbnail-progress-marker" style="width: '+percentage+'"></div></div>';
187
  } else {
188
  progress += '<div class="thumbnail-status-error">Error</div>';
189
  }
252
 
253
  // adds new tab on top of the Media Library popup
254
  function fv_flowplayer_media_browser_add_tab(tabId, tabText, tabOnClickCallback, tabAddedCallback, tabClickEventCallback) {
255
+ var $tab = jQuery('#' + tabId);
256
+
257
+ if (!$tab.length) {
258
  var
259
  $router = jQuery('.media-router:visible'),
260
  $nativeTabs = $router.find('.media-menu-item:not(.artificial)'),
309
  .text(tabText)
310
  .addClass('artificial')
311
  .on('click', function() {
 
 
 
 
 
312
  // disable Choose button
313
  jQuery('.media-button-select').prop('disabled', 'disabled');
314
  $router.find('.media-menu-item.active').removeClass('active');
315
  jQuery(this).addClass('active');
316
 
317
+ fv_flowplayer_media_browser_disable_drag_drop(true);
318
+ fv_flowplayer_media_browser_show_upload( jQuery(this).attr('id') );
319
+
320
  // execute tab click function
321
  if (typeof(tabClickEventCallback) == 'function' && !switchClicking) {
322
  tabClickEventCallback();
329
  }
330
  } catch(e) {}
331
 
332
+ // hide the Drop files to upload modal initially
333
+ jQuery('.media-modal .uploader-window').css({
334
+ 'display' : 'none',
335
+ 'opacity' : 0,
336
+ });
337
+
338
  return tabOnClickCallback();
339
  });
340
 
346
  tabAddedCallback($item);
347
  }
348
 
349
+ $tab = $item;
350
  }
351
 
352
  // if this tab was the last active, make it active again
359
  }, 500);
360
  }
361
  } catch(e) {}
362
+
363
+ return $tab;
364
  };
365
 
366
  /*
367
  * Disable/enable core WordPress drag&drop uploader
368
  */
369
  function fv_flowplayer_media_browser_disable_drag_drop( disable ) {
370
+ var
371
+ overlay = jQuery('.media-frame-uploader')
372
+ overlay_content = jQuery('.media-modal .uploader-window'),
373
+ drop_targets = jQuery('[id^=__wp-uploader-id-'),
374
+ upload_supported = fv_player_get_active_tab().hasClass( 'upload_supported' );
375
 
376
  if( disable ) {
377
  drop_targets.off('drop', fv_flowplayer_media_browser_disable_drag_drop_worker );
378
  drop_targets.on('drop', fv_flowplayer_media_browser_disable_drag_drop_worker );
379
 
380
+ if ( !upload_supported ) {
381
+ overlay.css('opacity', 0 );
382
+ } else {
383
+ overlay.css('opacity', 1 );
384
+ }
385
 
386
  } else {
387
  drop_targets.off('drop', fv_flowplayer_media_browser_disable_drag_drop_worker );
388
 
389
+ if ( !upload_supported ) {
390
+ overlay.css('opacity', '' );
391
+
392
+ // We need to hide this now as WordPress did make it visible at some point
393
+ overlay_content.css({
394
+ 'display' : 'none',
395
+ 'opacity' : 0,
396
+ });
397
+ } else {
398
+ overlay.css('opacity', 1 );
399
+ overlay_content.css({
400
+ 'display' : 'block',
401
+ 'opacity' : 1,
402
+ });
403
+ }
404
  }
405
  }
406
 
407
+ function fv_flowplayer_media_browser_disable_drag_drop_worker( e ) {
408
+ // forward this event via a custom trigger which gets intercepted by our browsers that support file uploads
409
+ // ... if we just returned false here without the custom trigger, we're basically prevent any drop event anywhere on the Media Browser dialog
410
+ jQuery( document ).trigger('media_browser_drop_event', [ fv_player_get_active_tab().attr( 'id' ), e.originalEvent.dataTransfer.files ] );
411
  return false;
412
  }
413
 
501
  function locateSplashFileObjectForMediaFileHref(href) {
502
  var find = [ fileGetBase(href) ];
503
 
504
+ if( window.fv_player_editor_pro && fv_player_editor_pro.video_qualities ) {
505
+ Object.keys(fv_player_editor_pro.video_qualities).forEach( function(prefix) {
506
  var re = new RegExp(prefix+'$');
507
  if( find[0].match(re) ) {
508
  find.push( find[0].replace(re,'') );
510
  });
511
  }
512
 
513
+ var
514
+ splash = false,
515
+ activeTabId = jQuery( '.media-router:visible .media-menu-item.active' ).attr('id');
516
 
517
  for( var i in find ) {
518
  for( var j in fv_flowplayer_scannedFiles ) {
519
+ var
520
+ f = fv_flowplayer_scannedFiles[j],
521
+ // check for image splash files with the same base name that are not poining to the same actual file
522
  // as the one we're checking them against (classic splash files)
523
+ splashCheck = ( f && f.link && f.link.match(/\.(jpg|jpeg|png|gif)$/) && fileGetBase(f.link) == find[i] && f.link != href );
524
+
525
+ // check for any additional inclusions and exclusions in splash checks
526
+ if ( fv_flowplayer_browser_splash_file_lookup_rules[ activeTabId ] ) {
527
+ // see if we have additional files to include as splash images
528
+ if ( fv_flowplayer_browser_splash_file_lookup_rules[ activeTabId ]['include'] ) {
529
+ // check for each of these file names against current file name
530
+ for ( var value of fv_flowplayer_browser_splash_file_lookup_rules[ activeTabId ]['include'] ) {
531
+ var regexCheck = new RegExp( value );
532
+ if ( f && f.link && f.link.match( regexCheck ) && fileGetBase(f.link) == find[i] ) {
533
+ // file pattern found, simply set splashCheck to true and bail out to continue with exclusion checks
534
+ splashCheck = true;
535
+ break;
536
+ }
537
+ }
538
+ }
539
+
540
+ // see if we have additional files to exclude as splash images
541
+ if ( fv_flowplayer_browser_splash_file_lookup_rules[ activeTabId ]['exclude'] ) {
542
+ // check for each of these file names against current file name
543
+ for ( var value of fv_flowplayer_browser_splash_file_lookup_rules[ activeTabId ]['exclude'] ) {
544
+ var regexCheck = new RegExp( value );
545
+ if ( f && f.link && !f.link.match( regexCheck ) && fileGetBase(f.link) == find[i] ) {
546
+ // file pattern found, simply set splashCheck to false and bail out, as we must exclude this file as splash
547
+ splashCheck = false;
548
+ break;
549
+ }
550
+ }
551
+ }
552
+ }
553
+
554
+ if ( splashCheck ) {
555
  splash = f;
556
  }
557
  }
585
  splash_name = 'splash';
586
  }
587
 
588
+ // Perhaps it's a older encoding job without splash_large, so check carfully
589
+ splash = file[splash_name] ? file[splash_name] : file['splash']
590
 
591
  // we remove the signature when we're updating the Editor field, otherwise we leave it in,
592
  // so we can actually preview the splash
593
+ if ( splash && typeof( strip_signature ) != 'undefined' && strip_signature && splash.indexOf('?') > -1) {
594
  splash = splash.substring(0, splash.indexOf('?'));
595
  }
596
 
707
  fSize = parseInt($filenameDiv.data('size')),
708
  fSizeTextual = fSize != $filenameDiv.data('size'),
709
  fDuration = parseInt($filenameDiv.data('duration')),
710
+ sizeSuffix = 'bytes',
711
  fExtraDisplayData = $filenameDiv.data('extra');
712
  fExtraDisplayData = fExtraDisplayData.displayData;
 
713
 
714
  if (!fSizeTextual) {
715
  // if filesize is too small, show it in KBytes
799
  '\t\t' + ( ($filenameDiv.data('extra') != 'undefined' && $filenameDiv.data('extra').trailer_src != undefined ) ? '<button type="button" class="button media-button trailer-button-select">Select Trailer</button>' : '' ) +
800
  '\t</div>');
801
 
802
+ // if this item is unselectable (i.e. a Coconut job that errored-out or encoding job that's still being processed externally), disable the Choose button
803
+ if ( $filenameDiv.data('extra') && $filenameDiv.data('extra').disabled ) {
804
  jQuery('.media-button-select').prop('disabled', 'disabled');
805
  } else {
806
  // enable Choose button
855
  return false;
856
  });
857
 
858
+ // listen to a drop event on one of our browser tabs and hide the drop overlay
859
+ // since WP does not do this for us apart from in its own upload tab
860
+ $( document ).on( "media_browser_drop_event", function() {
861
+ if ( fv_player_get_active_tab().hasClass('upload_supported') ) {
862
+ $( '.media-modal .uploader-window' ).css({
863
+ 'display' : 'none',
864
+ 'opacity' : 0,
865
+ });
866
+ }
867
+ });
868
+
869
  });
js/s3-upload-base.js CHANGED
@@ -8,11 +8,14 @@ function fv_flowplayer_init_s3_uploader( options ) {
8
  $progressBar,
9
  $progressBarNumber,
10
  $progressBarDiv,
 
11
  s3upload = null,
12
  file_select_input_name = options.file_select_input_name,
13
  file_select_input_class = options.file_select_input_class,
 
14
  upload_success_message = options.upload_success_message,
15
- upload_success_callback = options.upload_success_callback;
 
16
 
17
  function recreate_file_input( input_name, input_class_name ) {
18
  if ( $uploadInput.length ) {
@@ -21,7 +24,7 @@ function fv_flowplayer_init_s3_uploader( options ) {
21
 
22
  $uploadButton.after('<input type="file" accept=".mp4,.mov,.web,.flv,.avi,.vmw,.avchd,.swf,.mkv,.webm.,mpeg,.mpg" class="fv-player-s3-upload-file-input ' + input_class_name + '" name="' + input_name + '" />');
23
 
24
- $uploadInput = $('.media-frame-toolbar .media-toolbar-secondary > .upload_buttons .' + input_class_name);
25
  $uploadInput.change(function() {
26
  upload( $uploadInput[0].files[0] );
27
  });
@@ -49,12 +52,14 @@ function fv_flowplayer_init_s3_uploader( options ) {
49
  s3upload.onServerError = function(command, jqXHR, textStatus, errorThrown) {
50
  $progressDiv.text("Upload failed with server error.");
51
  $progressBarDiv.hide();
 
52
  console.log( command, jqXHR, textStatus, errorThrown );
53
  };
54
 
55
  s3upload.onS3UploadError = function(xhr) {
56
  $progressDiv.text("Upload failed.");
57
  $progressBarDiv.hide();
 
58
  console.log( xhr );
59
  };
60
 
@@ -89,6 +94,8 @@ function fv_flowplayer_init_s3_uploader( options ) {
89
  };
90
 
91
  $progressDiv.text("Preparing upload...");
 
 
92
  s3upload.start();
93
  }
94
 
@@ -105,7 +112,6 @@ function fv_flowplayer_init_s3_uploader( options ) {
105
 
106
  $(document).on("mediaBrowserOpen", function (event) {
107
  var
108
- upload_button_class = options.upload_button_class, //'fv-player-coconut-browser-upload',
109
  upload_button_text = options.upload_button_text, //'Upload to Coconut',
110
  cancel_button_class = options.cancel_button_class, //'fv-player-coconut-browser-upload-cancel',
111
  upload_progress_class = options.upload_progress_class, //'fv-player-coconut-browser-upload-progress',
@@ -115,13 +121,13 @@ function fv_flowplayer_init_s3_uploader( options ) {
115
 
116
  // add Upload to Coconut button to the media library modal
117
  if ( !$('.' + upload_button_class).length ) {
118
- if ( !$('.media-frame-toolbar .media-toolbar-secondary > .upload_buttons').length ) {
119
- $('.media-frame-toolbar .media-toolbar-secondary').append('<div id="'+upload_button_text+'-wrap" class="upload_buttons" style="display: none" data-tab-id="'+options.tab_id+'"></div>');
120
  }
121
 
122
  // check if we have the correct player version
123
  if ( !fv_player_coconut_dos_upload_settings.can_use_get_space ) {
124
- $('.media-frame-toolbar .media-toolbar-secondary > .upload_buttons').append('<button type="button" class="button media-button button-primary button-large ' + upload_button_class + '">' + upload_button_text + '</button>');
125
 
126
  $('.' + upload_button_class).click(function() {
127
  alert('This functionality requires the latest version of FV Flowplayer. Please update your WordPress plugins.');
@@ -129,7 +135,7 @@ function fv_flowplayer_init_s3_uploader( options ) {
129
  return;
130
  }
131
 
132
- var $uploadDiv = $('.media-frame-toolbar .media-toolbar-secondary > .upload_buttons');
133
 
134
  var upload_interface = '<div class="fv-player-s3-upload-buttons">'
135
  upload_interface += '<button type="button" class="button media-button button-primary button-large ' + upload_button_class + '">' + upload_button_text + '</button>';
@@ -144,7 +150,7 @@ function fv_flowplayer_init_s3_uploader( options ) {
144
  upload_interface += '<div class="fv-player-s3-upload-progress-enclosure ' + upload_progress_bar_enclosure_class + '"><div class="fv-player-s3-upload-progress-bar ' + upload_progress_bar_class + '"></div><div class="fv-player-s3-upload-progress-number ' + upload_progress_bar_number_class + '"></div></div>';
145
  upload_interface += '</div>';
146
 
147
- $('.media-frame-toolbar .media-toolbar-secondary > .upload_buttons').append( upload_interface);
148
 
149
  $uploadButton = $uploadDiv.find('.' + upload_button_class);
150
  $uploadInput = $uploadDiv.find('.' + file_select_input_class);
@@ -169,6 +175,7 @@ function fv_flowplayer_init_s3_uploader( options ) {
169
  $uploadButton.add( $cancelButton ).toggle();
170
  recreate_file_input( file_select_input_name, file_select_input_class );
171
  $progressDiv.html('Upload cancelled.');
 
172
  $progressBarDiv.hide();
173
  });
174
  }
@@ -176,10 +183,11 @@ function fv_flowplayer_init_s3_uploader( options ) {
176
 
177
  return {
178
  update_progress_bar_text: function( txt ) {
179
- $progressDiv.text( txt );
180
  },
181
  hide_progress_bar: function() {
182
  $progressBarDiv.hide();
183
- }
 
184
  }
185
  }
8
  $progressBar,
9
  $progressBarNumber,
10
  $progressBarDiv,
11
+ upload_button_class = options.upload_button_class, //'fv-player-coconut-browser-upload',
12
  s3upload = null,
13
  file_select_input_name = options.file_select_input_name,
14
  file_select_input_class = options.file_select_input_class,
15
+ upload_start_callback = ( typeof( options.upload_start_callback ) == 'function' ? options.upload_start_callback : function() {} ),
16
  upload_success_message = options.upload_success_message,
17
+ upload_success_callback = options.upload_success_callback,
18
+ upload_error_callback = ( typeof( options.upload_error_callback ) == 'function' ? options.upload_error_callback : function() {} );
19
 
20
  function recreate_file_input( input_name, input_class_name ) {
21
  if ( $uploadInput.length ) {
24
 
25
  $uploadButton.after('<input type="file" accept=".mp4,.mov,.web,.flv,.avi,.vmw,.avchd,.swf,.mkv,.webm.,mpeg,.mpg" class="fv-player-s3-upload-file-input ' + input_class_name + '" name="' + input_name + '" />');
26
 
27
+ $uploadInput = $('.media-frame-toolbar .media-toolbar-secondary > #' + upload_button_class + '-wrap .' + input_class_name);
28
  $uploadInput.change(function() {
29
  upload( $uploadInput[0].files[0] );
30
  });
52
  s3upload.onServerError = function(command, jqXHR, textStatus, errorThrown) {
53
  $progressDiv.text("Upload failed with server error.");
54
  $progressBarDiv.hide();
55
+ upload_error_callback();
56
  console.log( command, jqXHR, textStatus, errorThrown );
57
  };
58
 
59
  s3upload.onS3UploadError = function(xhr) {
60
  $progressDiv.text("Upload failed.");
61
  $progressBarDiv.hide();
62
+ upload_error_callback();
63
  console.log( xhr );
64
  };
65
 
94
  };
95
 
96
  $progressDiv.text("Preparing upload...");
97
+
98
+ upload_start_callback();
99
  s3upload.start();
100
  }
101
 
112
 
113
  $(document).on("mediaBrowserOpen", function (event) {
114
  var
 
115
  upload_button_text = options.upload_button_text, //'Upload to Coconut',
116
  cancel_button_class = options.cancel_button_class, //'fv-player-coconut-browser-upload-cancel',
117
  upload_progress_class = options.upload_progress_class, //'fv-player-coconut-browser-upload-progress',
121
 
122
  // add Upload to Coconut button to the media library modal
123
  if ( !$('.' + upload_button_class).length ) {
124
+ if ( !$('.media-frame-toolbar .media-toolbar-secondary > #'+upload_button_class+'-wrap').length ) {
125
+ $('.media-frame-toolbar .media-toolbar-secondary').append('<div id="' + upload_button_class + '-wrap" class="upload_buttons" style="display: none" data-tab-id="'+options.tab_id+'"></div>');
126
  }
127
 
128
  // check if we have the correct player version
129
  if ( !fv_player_coconut_dos_upload_settings.can_use_get_space ) {
130
+ $('.media-frame-toolbar .media-toolbar-secondary > #' + upload_button_class + '-wrap').append('<button type="button" class="button media-button button-primary button-large ' + upload_button_class + '">' + upload_button_text + '</button>');
131
 
132
  $('.' + upload_button_class).click(function() {
133
  alert('This functionality requires the latest version of FV Flowplayer. Please update your WordPress plugins.');
135
  return;
136
  }
137
 
138
+ var $uploadDiv = $('.media-frame-toolbar .media-toolbar-secondary > #' + upload_button_class + '-wrap');
139
 
140
  var upload_interface = '<div class="fv-player-s3-upload-buttons">'
141
  upload_interface += '<button type="button" class="button media-button button-primary button-large ' + upload_button_class + '">' + upload_button_text + '</button>';
150
  upload_interface += '<div class="fv-player-s3-upload-progress-enclosure ' + upload_progress_bar_enclosure_class + '"><div class="fv-player-s3-upload-progress-bar ' + upload_progress_bar_class + '"></div><div class="fv-player-s3-upload-progress-number ' + upload_progress_bar_number_class + '"></div></div>';
151
  upload_interface += '</div>';
152
 
153
+ $('.media-frame-toolbar .media-toolbar-secondary > #' + upload_button_class + '-wrap').append( upload_interface);
154
 
155
  $uploadButton = $uploadDiv.find('.' + upload_button_class);
156
  $uploadInput = $uploadDiv.find('.' + file_select_input_class);
175
  $uploadButton.add( $cancelButton ).toggle();
176
  recreate_file_input( file_select_input_name, file_select_input_class );
177
  $progressDiv.html('Upload cancelled.');
178
+ upload_error_callback();
179
  $progressBarDiv.hide();
180
  });
181
  }
183
 
184
  return {
185
  update_progress_bar_text: function( txt ) {
186
+ $progressDiv.html( txt );
187
  },
188
  hide_progress_bar: function() {
189
  $progressBarDiv.hide();
190
+ },
191
+ upload: upload,
192
  }
193
  }
js/shortcode-editor.js CHANGED
@@ -13,6 +13,7 @@ var fv_player_editor_matcher = {
13
  jQuery(function() {
14
  // The actual editor
15
  window.fv_player_editor = (function($) {
 
16
 
17
  var
18
  $doc = $(document),
@@ -215,6 +216,8 @@ jQuery(function() {
215
  });*/
216
 
217
  if( jQuery().fv_player_box ) {
 
 
218
  $doc.on( 'click', '.fv-wordpress-flowplayer-button, .fv-player-editor-button, .fv-player-edit', function(e) {
219
  // make the TinyMCE editor below this button active,
220
  // as otherwise we would be inserting into the last TinyMCE instance
@@ -266,6 +269,8 @@ jQuery(function() {
266
  onComplete : function() {
267
  overlay_show('loading');
268
 
 
 
269
  $.post(ajaxurl, {
270
  action: 'fv_player_db_export',
271
  playerID : $element.data('player_id'),
@@ -336,6 +341,8 @@ jQuery(function() {
336
  $element_td.find('a, span').hide();
337
  $element.after($spinner);
338
 
 
 
339
  jQuery.post(ajaxurl, {
340
  action: "fv_player_db_remove",
341
  nonce: $element.data('nonce'),
@@ -372,6 +379,8 @@ jQuery(function() {
372
  .hide()
373
  .after($spinner);
374
 
 
 
375
  $.post(ajaxurl, {
376
  action: "fv_player_db_clone",
377
  nonce: $element.data('nonce'),
@@ -598,6 +607,9 @@ jQuery(function() {
598
  if( jQuery('#remove-post-thumbnail').length > 0 ){
599
  return;
600
  }
 
 
 
601
  jQuery.post(ajaxurl, {
602
  action:"set-post-thumbnail",
603
  post_id: fv_flowplayer_set_post_thumbnail_id,
@@ -800,6 +812,8 @@ jQuery(function() {
800
 
801
  $('.fv-player-save-error').hide();
802
 
 
 
803
  $.post(ajaxurl+'?fv_player_db_save=1', {
804
  action: 'fv_player_db_save',
805
  data: JSON.stringify(ajax_save_this_please),
@@ -997,6 +1011,9 @@ jQuery(function() {
997
 
998
  fv_player_editor.meta_data_load_started();
999
  var ajax_call = function () {
 
 
 
1000
  $element.data('fv_player_video_data_ajax', jQuery.post(ajaxurl, {
1001
  action: 'fv_wp_flowplayer_retrieve_video_data',
1002
  video_url: $element.val(),
@@ -1364,6 +1381,8 @@ jQuery(function() {
1364
  // show loader
1365
  overlay_show('loading');
1366
 
 
 
1367
  $.post(ajaxurl, {
1368
  // TODO: Nonce
1369
  action: 'fv_player_db_retrieve_all_players_for_dropdown',
@@ -1799,6 +1818,13 @@ jQuery(function() {
1799
  return data;
1800
  }
1801
 
 
 
 
 
 
 
 
1802
  /*
1803
  * Closing the editor
1804
  * * updates the wp-admin -> FV Player screen
@@ -1910,8 +1936,31 @@ jQuery(function() {
1910
  is_gutenberg = $(editor_button_clicked).parents('.fv-player-gutenberg').length;
1911
 
1912
  if (!db_id) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1913
  // custom Field or Widget
1914
- if (field.length || jQuery('#widget-widget_fvplayer-' + widget_id + '-text').length) {
 
 
1915
  // this is a horrible hack as it adds the hidden marker to the otherwise clean text field value
1916
  // just to make sure the shortcode varible below is parsed properly.
1917
  // But it allows some extra text to be entered into the text widget, so for now - ok
@@ -1921,8 +1970,11 @@ jQuery(function() {
1921
  editor_content = '<' + helper_tag + ' rel="FCKFVWPFlowplayerPlaceholder">&shy;</' + helper_tag + '>' + editor_content + '';
1922
  }
1923
 
1924
- // TinyMCE in Text Mode
1925
- } else if (typeof (FCKeditorAPI) == 'undefined' && jQuery('#content:not([aria-hidden=true])').length) {
 
 
 
1926
  var position = jQuery('#content:not([aria-hidden=true])').prop('selectionStart');
1927
 
1928
  // look for start of shortcode
@@ -1943,22 +1995,13 @@ jQuery(function() {
1943
  // TODO: It would be better to use #fv_player_editor_{random number}# and remember it for the editing session
1944
  editor_content = editor_content.slice(0, position) + '#fvp_placeholder#' + editor_content.slice(position);
1945
 
1946
- // Edit button on wp-admin -> FV Player screen
1947
- } else if (is_fv_player_screen_edit(editor_button_clicked)) {
1948
- current_player_db_id = $(editor_button_clicked).data('player_id');
1949
 
1950
- // create an artificial shortcode from which we can extract the actual player ID later below
1951
- editor_content = '[fvplayer id="' + current_player_db_id + '"]';
1952
- shortcode = [editor_content];
1953
 
1954
- // Add new button on wp-admin -> FV Player screen
1955
- } else if (is_fv_player_screen_add_new(editor_button_clicked)) {
1956
- // create empty shortcode for Add New button on the list page
1957
- editor_content = '';
1958
- shortcode = '';
1959
 
1960
- // Foliopress WYSIWYG
1961
- } else if (instance_tinymce == undefined || (typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor.isHidden())) {
1962
  editor_content = instance_fp_wysiwyg.GetHTML();
1963
  if (editor_content.match(fv_wp_flowplayer_re_insert) == null) {
1964
  instance_fp_wysiwyg.InsertHtml('<' + fvwpflowplayer_helper_tag + ' rel="FCKFVWPFlowplayerPlaceholder">&shy;</' + fvwpflowplayer_helper_tag + '>');
@@ -1966,6 +2009,8 @@ jQuery(function() {
1966
  }
1967
 
1968
  } else {
 
 
1969
  // TinyMCE in Visual Mode
1970
  editor_content = instance_tinymce.getContent();
1971
  instance_tinymce.settings.validate = false;
@@ -1995,6 +2040,8 @@ jQuery(function() {
1995
  // but don't replace editor_content, since we'll need that to be actually updated
1996
  // rather then set to a player ID
1997
  if (db_id) {
 
 
1998
  content = db_id;
1999
 
2000
  // we loose the #fvp_placeholder# placeholder in TinyMCE text mode, so let's re-add it here
@@ -2043,6 +2090,8 @@ jQuery(function() {
2043
  }
2044
 
2045
  if( shortcode != null && typeof(shortcode) != 'undefined' && typeof(shortcode[0]) != 'undefined') {
 
 
2046
  // check for new, DB-based player shortcode
2047
  var result = /fvplayer.* id="([\d,]+)"/g.exec(shortcode);
2048
  if (result !== null) {
@@ -2060,6 +2109,8 @@ jQuery(function() {
2060
  // in WP heartbeat
2061
  current_player_db_id = result[1];
2062
 
 
 
2063
  if (edit_lock_removal[result[1]]) {
2064
  delete edit_lock_removal[result[1]];
2065
  }
@@ -2076,13 +2127,17 @@ jQuery(function() {
2076
 
2077
  // now load playlist data
2078
  // load video data via an AJAX call
2079
- fv_player_shortcode_editor_ajax = jQuery.post(ajaxurl, {
 
 
2080
  action : 'fv_player_db_load',
2081
  nonce : fv_player_editor_conf.db_load_nonce,
2082
  playerID : result[1]
2083
  }, function(response) {
2084
  var vids = response['videos'];
2085
 
 
 
2086
  if (response) {
2087
  if( typeof(response) != "object" ) {
2088
  overlay_show('message', 'Error: '+response);
@@ -2336,6 +2391,8 @@ jQuery(function() {
2336
  }
2337
  });
2338
  } else {
 
 
2339
  $doc.trigger('fv-player-editor-non-db-shortcode');
2340
  // ordinary text shortcode in the editor
2341
  var shortcode_parse_fix = shortcode.replace(/(popup|ad)='[^']*?'/g, '');
@@ -2630,6 +2687,8 @@ jQuery(function() {
2630
  }
2631
 
2632
  } else {
 
 
2633
  jQuery(document).trigger('fv_flowplayer_shortcode_new');
2634
  shortcode_remains = '';
2635
  fix_save_btn_text();
@@ -2748,6 +2807,8 @@ jQuery(function() {
2748
  ajax_data['status'] = 'published';
2749
  }
2750
 
 
 
2751
  // save data
2752
  jQuery.post(ajaxurl, {
2753
  action: 'fv_player_db_save',
@@ -3437,6 +3498,8 @@ jQuery(function() {
3437
 
3438
  overlay_show('loading');
3439
 
 
 
3440
  jQuery.post(ajaxurl, {
3441
  action: 'fv_player_db_import',
3442
  nonce: fv_player_editor_conf.db_import_nonce,
13
  jQuery(function() {
14
  // The actual editor
15
  window.fv_player_editor = (function($) {
16
+ debug_log('Loading...');
17
 
18
  var
19
  $doc = $(document),
216
  });*/
217
 
218
  if( jQuery().fv_player_box ) {
219
+ debug_log('Attaching click actions...');
220
+
221
  $doc.on( 'click', '.fv-wordpress-flowplayer-button, .fv-player-editor-button, .fv-player-edit', function(e) {
222
  // make the TinyMCE editor below this button active,
223
  // as otherwise we would be inserting into the last TinyMCE instance
269
  onComplete : function() {
270
  overlay_show('loading');
271
 
272
+ debug_log('Running fv_player_db_export Ajax.');
273
+
274
  $.post(ajaxurl, {
275
  action: 'fv_player_db_export',
276
  playerID : $element.data('player_id'),
341
  $element_td.find('a, span').hide();
342
  $element.after($spinner);
343
 
344
+ debug_log('Running fv_player_db_remove Ajax.');
345
+
346
  jQuery.post(ajaxurl, {
347
  action: "fv_player_db_remove",
348
  nonce: $element.data('nonce'),
379
  .hide()
380
  .after($spinner);
381
 
382
+ debug_log('Running fv_player_db_clone Ajax.');
383
+
384
  $.post(ajaxurl, {
385
  action: "fv_player_db_clone",
386
  nonce: $element.data('nonce'),
607
  if( jQuery('#remove-post-thumbnail').length > 0 ){
608
  return;
609
  }
610
+
611
+ debug_log('Running set-post-thumbnail Ajax.');
612
+
613
  jQuery.post(ajaxurl, {
614
  action:"set-post-thumbnail",
615
  post_id: fv_flowplayer_set_post_thumbnail_id,
812
 
813
  $('.fv-player-save-error').hide();
814
 
815
+ debug_log('Running fv_player_db_save Ajax.');
816
+
817
  $.post(ajaxurl+'?fv_player_db_save=1', {
818
  action: 'fv_player_db_save',
819
  data: JSON.stringify(ajax_save_this_please),
1011
 
1012
  fv_player_editor.meta_data_load_started();
1013
  var ajax_call = function () {
1014
+
1015
+ debug_log('Running fv_wp_flowplayer_retrieve_video_data Ajax.');
1016
+
1017
  $element.data('fv_player_video_data_ajax', jQuery.post(ajaxurl, {
1018
  action: 'fv_wp_flowplayer_retrieve_video_data',
1019
  video_url: $element.val(),
1381
  // show loader
1382
  overlay_show('loading');
1383
 
1384
+ debug_log('Running fv_player_db_retrieve_all_players_for_dropdown Ajax.');
1385
+
1386
  $.post(ajaxurl, {
1387
  // TODO: Nonce
1388
  action: 'fv_player_db_retrieve_all_players_for_dropdown',
1818
  return data;
1819
  }
1820
 
1821
+ function debug_log( message, details ) {
1822
+ console.log( 'FV Player Editor: '+message);
1823
+ if( details ) {
1824
+ console.log(details);
1825
+ }
1826
+ }
1827
+
1828
  /*
1829
  * Closing the editor
1830
  * * updates the wp-admin -> FV Player screen
1936
  is_gutenberg = $(editor_button_clicked).parents('.fv-player-gutenberg').length;
1937
 
1938
  if (!db_id) {
1939
+ // Edit button on wp-admin -> FV Player screen
1940
+ if (is_fv_player_screen_edit(editor_button_clicked)) {
1941
+ current_player_db_id = $(editor_button_clicked).data('player_id');
1942
+
1943
+ debug_log('Loading for FV Player screen, player id: '+current_player_db_id );
1944
+
1945
+ // create an artificial shortcode from which we can extract the actual player ID later below
1946
+ editor_content = '[fvplayer id="' + current_player_db_id + '"]';
1947
+ shortcode = [editor_content];
1948
+ }
1949
+
1950
+ // Add new button on wp-admin -> FV Player screen
1951
+ else if (is_fv_player_screen_add_new(editor_button_clicked)) {
1952
+ debug_log('Loading for FV Player screen, new player' );
1953
+
1954
+ // create empty shortcode for Add New button on the list page
1955
+ editor_content = '';
1956
+ shortcode = '';
1957
+
1958
+ }
1959
+
1960
  // custom Field or Widget
1961
+ else if (field.length || jQuery('#widget-widget_fvplayer-' + widget_id + '-text').length) {
1962
+ debug_log('Loading for custom field or a widget...');
1963
+
1964
  // this is a horrible hack as it adds the hidden marker to the otherwise clean text field value
1965
  // just to make sure the shortcode varible below is parsed properly.
1966
  // But it allows some extra text to be entered into the text widget, so for now - ok
1970
  editor_content = '<' + helper_tag + ' rel="FCKFVWPFlowplayerPlaceholder">&shy;</' + helper_tag + '>' + editor_content + '';
1971
  }
1972
 
1973
+ }
1974
+ // TinyMCE in Text Mode
1975
+ else if (typeof (FCKeditorAPI) == 'undefined' && jQuery('#content:not([aria-hidden=true])').length) {
1976
+ debug_log('Loading for TinyMCE in Text Mode...');
1977
+
1978
  var position = jQuery('#content:not([aria-hidden=true])').prop('selectionStart');
1979
 
1980
  // look for start of shortcode
1995
  // TODO: It would be better to use #fv_player_editor_{random number}# and remember it for the editing session
1996
  editor_content = editor_content.slice(0, position) + '#fvp_placeholder#' + editor_content.slice(position);
1997
 
 
 
 
1998
 
1999
+ }
 
 
2000
 
2001
+ // Foliopress WYSIWYG
2002
+ else if (instance_tinymce == undefined || (typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor.isHidden())) {
2003
+ debug_log('Loading for Foliopress WYSIWYG...' );
 
 
2004
 
 
 
2005
  editor_content = instance_fp_wysiwyg.GetHTML();
2006
  if (editor_content.match(fv_wp_flowplayer_re_insert) == null) {
2007
  instance_fp_wysiwyg.InsertHtml('<' + fvwpflowplayer_helper_tag + ' rel="FCKFVWPFlowplayerPlaceholder">&shy;</' + fvwpflowplayer_helper_tag + '>');
2009
  }
2010
 
2011
  } else {
2012
+ debug_log('Loading for TinyMCE in Visual Mode...' );
2013
+
2014
  // TinyMCE in Visual Mode
2015
  editor_content = instance_tinymce.getContent();
2016
  instance_tinymce.settings.validate = false;
2040
  // but don't replace editor_content, since we'll need that to be actually updated
2041
  // rather then set to a player ID
2042
  if (db_id) {
2043
+ debug_log('Loading for player id: '+db_id );
2044
+
2045
  content = db_id;
2046
 
2047
  // we loose the #fvp_placeholder# placeholder in TinyMCE text mode, so let's re-add it here
2090
  }
2091
 
2092
  if( shortcode != null && typeof(shortcode) != 'undefined' && typeof(shortcode[0]) != 'undefined') {
2093
+ debug_log('Loading shortcode: '+shortcode );
2094
+
2095
  // check for new, DB-based player shortcode
2096
  var result = /fvplayer.* id="([\d,]+)"/g.exec(shortcode);
2097
  if (result !== null) {
2109
  // in WP heartbeat
2110
  current_player_db_id = result[1];
2111
 
2112
+ debug_log('Loading shortcode player id: '+current_player_db_id );
2113
+
2114
  if (edit_lock_removal[result[1]]) {
2115
  delete edit_lock_removal[result[1]];
2116
  }
2127
 
2128
  // now load playlist data
2129
  // load video data via an AJAX call
2130
+ debug_log('Running fv_player_db_load Ajax.');
2131
+
2132
+ fv_player_shortcode_editor_ajax = jQuery.post(ajaxurl+'?fv_player_db_load', {
2133
  action : 'fv_player_db_load',
2134
  nonce : fv_player_editor_conf.db_load_nonce,
2135
  playerID : result[1]
2136
  }, function(response) {
2137
  var vids = response['videos'];
2138
 
2139
+ debug_log('Finished fv_player_db_load Ajax.',response);
2140
+
2141
  if (response) {
2142
  if( typeof(response) != "object" ) {
2143
  overlay_show('message', 'Error: '+response);
2391
  }
2392
  });
2393
  } else {
2394
+ debug_log('Loading shortcode without player id...');
2395
+
2396
  $doc.trigger('fv-player-editor-non-db-shortcode');
2397
  // ordinary text shortcode in the editor
2398
  var shortcode_parse_fix = shortcode.replace(/(popup|ad)='[^']*?'/g, '');
2687
  }
2688
 
2689
  } else {
2690
+ debug_log('New player...' );
2691
+
2692
  jQuery(document).trigger('fv_flowplayer_shortcode_new');
2693
  shortcode_remains = '';
2694
  fix_save_btn_text();
2807
  ajax_data['status'] = 'published';
2808
  }
2809
 
2810
+ debug_log('Running fv_player_db_save Ajax.');
2811
+
2812
  // save data
2813
  jQuery.post(ajaxurl, {
2814
  action: 'fv_player_db_save',
3498
 
3499
  overlay_show('loading');
3500
 
3501
+ debug_log('Running fv_player_db_import Ajax.');
3502
+
3503
  jQuery.post(ajaxurl, {
3504
  action: 'fv_player_db_import',
3505
  nonce: fv_player_editor_conf.db_import_nonce,
js/video-checker.js CHANGED
@@ -215,6 +215,10 @@ function fv_wp_flowplayer_admin_show_notice( id ) {
215
  jQuery(this).toggleClass("is-open", is_open );
216
  jQuery(this).find(".fv-player-video-checker-details").toggle( is_open );
217
 
 
 
 
 
218
  root.toggleClass( 'has-video-checker', is_open );
219
 
220
  api.disable( is_open );
@@ -225,6 +229,7 @@ function fv_wp_flowplayer_admin_support_mail( hash, button ) {
225
  jQuery('.fv_flowplayer_submit_error').remove();
226
 
227
  var comment_text = jQuery('#wpfp_support_'+hash).val();
 
228
  var comment_words = comment_text.split(/\s/);
229
  if( comment_words.length == 0 || comment_text.match(/Enter your comment/) ) {
230
  jQuery('#wpfp_support_'+hash).before('<p class="fv_flowplayer_submit_error" style="display:none; "><strong>'+fv_flowplayer_translations.what_is_wrong+'</strong></p>');
@@ -245,14 +250,16 @@ function fv_wp_flowplayer_admin_support_mail( hash, button ) {
245
  fv_player.ajaxurl,
246
  {
247
  action: 'fv_wp_flowplayer_support_mail',
 
248
  comment: comment_text,
249
  notice: jQuery('#wpfp_notice_'+hash+' .mail-content-notice').html(),
250
  details: jQuery('#wpfp_notice_'+hash+' .mail-content-details').html()
251
  },
252
  function( response ) {
253
  jQuery('#wpfp_spin_'+hash).hide();
 
254
  jQuery(button).removeAttr("disabled");
255
  jQuery(button).after(' Message sent');
256
- }
257
  );
258
  }
215
  jQuery(this).toggleClass("is-open", is_open );
216
  jQuery(this).find(".fv-player-video-checker-details").toggle( is_open );
217
 
218
+ if( is_open ) {
219
+ jQuery('#fv_wp_fp_notice_'+id).find('input').show();
220
+ }
221
+
222
  root.toggleClass( 'has-video-checker', is_open );
223
 
224
  api.disable( is_open );
229
  jQuery('.fv_flowplayer_submit_error').remove();
230
 
231
  var comment_text = jQuery('#wpfp_support_'+hash).val();
232
+ var status_text = jQuery('#wpfp_notice_'+hash+'.fv-player-video-checker .video-checker-result').text();
233
  var comment_words = comment_text.split(/\s/);
234
  if( comment_words.length == 0 || comment_text.match(/Enter your comment/) ) {
235
  jQuery('#wpfp_support_'+hash).before('<p class="fv_flowplayer_submit_error" style="display:none; "><strong>'+fv_flowplayer_translations.what_is_wrong+'</strong></p>');
250
  fv_player.ajaxurl,
251
  {
252
  action: 'fv_wp_flowplayer_support_mail',
253
+ status: status_text,
254
  comment: comment_text,
255
  notice: jQuery('#wpfp_notice_'+hash+' .mail-content-notice').html(),
256
  details: jQuery('#wpfp_notice_'+hash+' .mail-content-details').html()
257
  },
258
  function( response ) {
259
  jQuery('#wpfp_spin_'+hash).hide();
260
+ jQuery('#fv_wp_fp_notice_'+hash).find('input').hide();
261
  jQuery(button).removeAttr("disabled");
262
  jQuery(button).after(' Message sent');
263
+ }
264
  );
265
  }
languages/fv-wordpress-flowplayer-cs_CZ.mo CHANGED
Binary file
languages/fv-wordpress-flowplayer-cs_CZ.po CHANGED
@@ -1,15 +1,17 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV WordPress Flowplayer v.6.0.3.4\n"
4
- "POT-Creation-Date: 2017-08-07 14:12+0200\n"
5
- "PO-Revision-Date: 2017-08-07 14:14+0200\n"
 
6
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
7
  "Language-Team: \n"
8
  "Language: cs\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.11\n"
 
13
  "X-Poedit-KeywordsList: __;_e;_n\n"
14
  "X-Poedit-Basepath: .\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
@@ -2208,6 +2210,27 @@ msgstr ""
2208
  msgid "Ad Size"
2209
  msgstr ""
2210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2211
  #~ msgid ""
2212
  #~ "FV Wordpress Flowplayer has found old shortcodes in the content of your "
2213
  #~ "posts. <a href=\"%1$s\">Run the conversion script.</a>"
@@ -2431,20 +2454,616 @@ msgstr ""
2431
  #~ "Flowplayer offers 98% coverage even on mobile devices."
2432
  #~ msgstr "sadsa"
2433
 
2434
- msgid "All"
2435
- msgstr "Vše"
 
2436
 
2437
- msgid "Play All"
2438
- msgstr "Přehrát vše"
2439
 
2440
- msgid "Replay Playlist"
2441
- msgstr "Opakuj playlist"
2442
 
2443
- msgid "Repeat Track"
2444
- msgstr "Opakuj video"
2445
 
2446
- msgid "Shuffle Playlist"
2447
- msgstr "Náhodný výběr"
 
 
 
2448
 
2449
- msgid "Item %d."
2450
- msgstr "Video %d."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV WordPress Flowplayer v.6.0.3.4\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2021-10-21 10:28+0100\n"
6
+ "PO-Revision-Date: 2021-10-21 10:28+0100\n"
7
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
8
  "Language-Team: \n"
9
  "Language: cs\n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: \n"
14
+ "X-Generator: Eazy Po 0.9.5.3\n"
15
  "X-Poedit-KeywordsList: __;_e;_n\n"
16
  "X-Poedit-Basepath: .\n"
17
  "X-Poedit-SourceCharset: UTF-8\n"
2210
  msgid "Ad Size"
2211
  msgstr ""
2212
 
2213
+ msgid "All"
2214
+ msgstr "Vše"
2215
+
2216
+ msgid "Play All"
2217
+ msgstr "Přehrát vše"
2218
+
2219
+ msgid "Replay Playlist"
2220
+ msgstr "Opakuj playlist"
2221
+
2222
+ msgid "Repeat Track"
2223
+ msgstr "Opakuj video"
2224
+
2225
+ msgid "Shuffle Playlist"
2226
+ msgstr "Náhodný výběr"
2227
+
2228
+ msgid "Item %d."
2229
+ msgstr "Video %d."
2230
+
2231
+ msgid "Click to unmute"
2232
+ msgstr "Zapnout zvuk"
2233
+
2234
  #~ msgid ""
2235
  #~ "FV Wordpress Flowplayer has found old shortcodes in the content of your "
2236
  #~ "posts. <a href=\"%1$s\">Run the conversion script.</a>"
2454
  #~ "Flowplayer offers 98% coverage even on mobile devices."
2455
  #~ msgstr "sadsa"
2456
 
2457
+ #, php-format
2458
+ #~ msgid "FV Player: Please upgrade to FV Player Pro version %s or above!"
2459
+ #~ msgstr ""
2460
 
2461
+ #~ msgid "Embed feature not supported in editor preview"
2462
+ #~ msgstr ""
2463
 
2464
+ #~ msgid "Link feature not supported in editor preview"
2465
+ #~ msgstr ""
2466
 
2467
+ #~ msgid "Video loading has stalled, click to reload"
2468
+ #~ msgstr ""
2469
 
2470
+ #, php-format
2471
+ #~ msgid "%s day"
2472
+ #~ msgid_plural "%s days"
2473
+ #~ msgstr[0] ""
2474
+ #~ msgstr[1] ""
2475
 
2476
+ #, php-format
2477
+ #~ msgid "%s hour"
2478
+ #~ msgid_plural "%s hours"
2479
+ #~ msgstr[0] ""
2480
+ #~ msgstr[1] ""
2481
+
2482
+ #, php-format
2483
+ #~ msgid "%s min"
2484
+ #~ msgid_plural "%s mins"
2485
+ #~ msgstr[0] ""
2486
+ #~ msgstr[1] ""
2487
+
2488
+ #, php-format
2489
+ #~ msgid "%s second"
2490
+ #~ msgid_plural "%s seconds"
2491
+ #~ msgstr[0] ""
2492
+ #~ msgstr[1] ""
2493
+
2494
+ #, php-format
2495
+ #~ msgid "%1$s and %2$s"
2496
+ #~ msgstr ""
2497
+
2498
+ #~ msgid "FV Player 7.5"
2499
+ #~ msgstr ""
2500
+
2501
+ #~ msgid "Thanks for letting me know!"
2502
+ #~ msgstr ""
2503
+
2504
+ #~ msgid "FV Player Video Lightbox"
2505
+ #~ msgstr ""
2506
+
2507
+ #~ msgid "FV Player database storage is here!"
2508
+ #~ msgstr ""
2509
+
2510
+ #~ msgid "FV Player Video Sitemap coverage"
2511
+ #~ msgstr ""
2512
+
2513
+ #~ msgid "Go to setting"
2514
+ #~ msgstr ""
2515
+
2516
+ #~ msgid "FV Player 7"
2517
+ #~ msgstr ""
2518
+
2519
+ #~ msgid "Africa (Cape Town)"
2520
+ #~ msgstr ""
2521
+
2522
+ #~ msgid "Asia Pacific (Hong Kong)"
2523
+ #~ msgstr ""
2524
+
2525
+ #~ msgid "Asia Pacific (Osaka-Local)"
2526
+ #~ msgstr ""
2527
+
2528
+ #~ msgid "China (Beijing)"
2529
+ #~ msgstr ""
2530
+
2531
+ #~ msgid "China (Ningxia)"
2532
+ #~ msgstr ""
2533
+
2534
+ #~ msgid "Europe (Frankfurt)"
2535
+ #~ msgstr ""
2536
+
2537
+ #~ msgid "Europe (Ireland)"
2538
+ #~ msgstr ""
2539
+
2540
+ #~ msgid "Europe (London)"
2541
+ #~ msgstr ""
2542
+
2543
+ #~ msgid "Europe (Milan)"
2544
+ #~ msgstr ""
2545
+
2546
+ #~ msgid "Europe (Paris)"
2547
+ #~ msgstr ""
2548
+
2549
+ #~ msgid "Europe (Stockholm)"
2550
+ #~ msgstr ""
2551
+
2552
+ #~ msgid "Middle East (Bahrain)"
2553
+ #~ msgstr ""
2554
+
2555
+ #~ msgid "South America (S&atilde;o Paulo)"
2556
+ #~ msgstr ""
2557
+
2558
+ #~ msgid "An unknown error occurred"
2559
+ #~ msgstr ""
2560
+
2561
+ #~ msgid " extension installed successfully!"
2562
+ #~ msgstr ""
2563
+
2564
+ #~ msgid " extension install failed - "
2565
+ #~ msgstr ""
2566
+
2567
+ #~ msgid " extension upgraded successfully!"
2568
+ #~ msgstr ""
2569
+
2570
+ #~ msgid "Domain"
2571
+ #~ msgstr ""
2572
+
2573
+ #~ msgid "You can enter multiple domains separated by <code>,</code>."
2574
+ #~ msgstr ""
2575
+
2576
+ #~ msgid "Secure Token"
2577
+ #~ msgstr ""
2578
+
2579
+ #~ msgid "Draft"
2580
+ #~ msgstr ""
2581
+
2582
+ #~ msgid "Remove fancyBox"
2583
+ #~ msgstr ""
2584
+
2585
+ #~ msgid "Your gallery items will link to image files directly to allow this."
2586
+ #~ msgstr ""
2587
+
2588
+ #~ msgid "Player Name"
2589
+ #~ msgstr ""
2590
+
2591
+ #~ msgid "Date"
2592
+ #~ msgstr ""
2593
+
2594
+ #~ msgid "Author"
2595
+ #~ msgstr ""
2596
+
2597
+ #~ msgid "Chapters"
2598
+ #~ msgstr ""
2599
+
2600
+ #~ msgid "Transcript"
2601
+ #~ msgstr ""
2602
+
2603
+ #~ msgid "Embedded on"
2604
+ #~ msgstr ""
2605
+
2606
+ #~ msgid "Plays"
2607
+ #~ msgstr ""
2608
+
2609
+ #~ msgid "Players per page"
2610
+ #~ msgstr ""
2611
+
2612
+ #~ msgid "no region"
2613
+ #~ msgstr ""
2614
+
2615
+ #~ msgid "Remember video position"
2616
+ #~ msgstr ""
2617
+
2618
+ #~ msgid "Video Stats"
2619
+ #~ msgstr ""
2620
+
2621
+ #~ msgid "Gives you a daily count of video plays."
2622
+ #~ msgstr ""
2623
+
2624
+ #~ msgid "System Info"
2625
+ #~ msgstr ""
2626
+
2627
+ #~ msgid "Install"
2628
+ #~ msgstr ""
2629
+
2630
+ #~ msgid "Reset"
2631
+ #~ msgstr ""
2632
+
2633
+ #~ msgid "Login"
2634
+ #~ msgstr ""
2635
+
2636
+ #~ msgid "Password"
2637
+ #~ msgstr ""
2638
+
2639
+ #~ msgid "Sign in"
2640
+ #~ msgstr ""
2641
+
2642
+ #~ msgid "Hide the vi Ads tab"
2643
+ #~ msgstr ""
2644
+
2645
+ #~ msgid "video intelligence"
2646
+ #~ msgstr ""
2647
+
2648
+ #~ msgid "Account"
2649
+ #~ msgstr ""
2650
+
2651
+ #~ msgid "Hide vi Ads"
2652
+ #~ msgstr ""
2653
+
2654
+ #~ msgid "Free video intelligence ads"
2655
+ #~ msgstr ""
2656
+
2657
+ #~ msgid "Show the vi Ads tab again"
2658
+ #~ msgstr ""
2659
+
2660
+ #~ msgid "vi Ads"
2661
+ #~ msgstr ""
2662
+
2663
+ #~ msgid "Use XML Video Sitemap"
2664
+ #~ msgstr ""
2665
+
2666
+ #~ msgid "Sitemap Post Meta"
2667
+ #~ msgstr ""
2668
+
2669
+ #~ msgid "Amazon S3 Browser"
2670
+ #~ msgstr ""
2671
+
2672
+ #~ msgid "Show Amazon S3 Browser in the \"Add Video\" dialog."
2673
+ #~ msgstr ""
2674
+
2675
+ #~ msgid "Controlbar Always Visible"
2676
+ #~ msgstr ""
2677
+
2678
+ #~ msgid "Enter values in pixels or 100%."
2679
+ #~ msgstr ""
2680
+
2681
+ #~ msgid "Enable Chromecast"
2682
+ #~ msgstr ""
2683
+
2684
+ #~ msgid "Adds support for Google Chromecast."
2685
+ #~ msgstr ""
2686
+
2687
+ #~ msgid "Force HD Streaming"
2688
+ #~ msgstr ""
2689
+
2690
+ #~ msgid "Use HD quality for HLS/MPEG-DASH even on slow connections."
2691
+ #~ msgstr ""
2692
+
2693
+ #~ msgid "Matomo/Piwik Tracking"
2694
+ #~ msgstr ""
2695
+
2696
+ #~ msgid "matomo.your-domain.com"
2697
+ #~ msgstr ""
2698
+
2699
+ #~ msgid "Site ID"
2700
+ #~ msgstr ""
2701
+
2702
+ #~ msgid "Multiple video playback"
2703
+ #~ msgstr ""
2704
+
2705
+ #~ msgid "No Picture Button"
2706
+ #~ msgstr ""
2707
+
2708
+ #~ msgid "Adds a button to turn the video picture on and off."
2709
+ #~ msgstr ""
2710
+
2711
+ #~ msgid "Slider"
2712
+ #~ msgstr ""
2713
+
2714
+ #~ msgid "Vertical Season"
2715
+ #~ msgstr ""
2716
+
2717
+ #~ msgid "Polaroid"
2718
+ #~ msgstr ""
2719
+
2720
+ #~ msgid "Text"
2721
+ #~ msgstr ""
2722
+
2723
+ #~ msgid "Repeat Button"
2724
+ #~ msgstr ""
2725
+
2726
+ #~ msgid "Adds a button to set playlist/track repeat and shuffle."
2727
+ #~ msgstr ""
2728
+
2729
+ #~ msgid "Rewind/Forward Button"
2730
+ #~ msgstr ""
2731
+
2732
+ #~ msgid "Adds a button to go 10 seconds back/forth."
2733
+ #~ msgstr ""
2734
+
2735
+ #~ msgid "Maintenance tools and debug info."
2736
+ #~ msgstr ""
2737
+
2738
+ #~ msgid "Disable saving skin CSS to a static file"
2739
+ #~ msgstr ""
2740
+
2741
+ #~ msgid "Handle WordPress audio/video"
2742
+ #~ msgstr ""
2743
+
2744
+ #~ msgid "Optimize FV Flowplayer JS loading"
2745
+ #~ msgstr ""
2746
+
2747
+ #~ msgid "Helps with Google PageSpeed scores."
2748
+ #~ msgstr ""
2749
+
2750
+ #~ msgid "Alternative iOS fullscreen mode"
2751
+ #~ msgstr ""
2752
+
2753
+ #~ msgid "Force landscape orientation in fullscreen"
2754
+ #~ msgstr ""
2755
+
2756
+ #~ msgid "Works on the Android mobile, not supported on iOS unfortunately."
2757
+ #~ msgstr ""
2758
+
2759
+ #~ msgid " Adds the video meta data information for search engines."
2760
+ #~ msgstr ""
2761
+
2762
+ #~ msgid "Show on pause"
2763
+ #~ msgstr ""
2764
+
2765
+ #~ msgid "Playlist Item Titles"
2766
+ #~ msgstr ""
2767
+
2768
+ #~ msgid "Splash Text"
2769
+ #~ msgstr ""
2770
+
2771
+ #~ msgid "Sticky"
2772
+ #~ msgstr ""
2773
+
2774
+ #~ msgid "Synopsis"
2775
+ #~ msgstr ""
2776
+
2777
+ #~ msgid "Color"
2778
+ #~ msgstr ""
2779
+
2780
+ #~ msgid "Controlbar Fullscreen"
2781
+ #~ msgstr ""
2782
+
2783
+ #~ msgid "Enter value in em"
2784
+ #~ msgstr ""
2785
+
2786
+ #~ msgid "Buttons"
2787
+ #~ msgstr ""
2788
+
2789
+ #~ msgid "Slim"
2790
+ #~ msgstr ""
2791
+
2792
+ #~ msgid "Full"
2793
+ #~ msgstr ""
2794
+
2795
+ #~ msgid "Fat"
2796
+ #~ msgstr ""
2797
+
2798
+ #~ msgid "Minimal"
2799
+ #~ msgstr ""
2800
+
2801
+ #~ msgid "Icons"
2802
+ #~ msgstr ""
2803
+
2804
+ #~ msgid "Edgy"
2805
+ #~ msgstr ""
2806
+
2807
+ #~ msgid "Outlined"
2808
+ #~ msgstr ""
2809
+
2810
+ #~ msgid "Playful"
2811
+ #~ msgstr ""
2812
+
2813
+ #~ msgid "(inherit from player)"
2814
+ #~ msgstr ""
2815
+
2816
+ #~ msgid "Second line."
2817
+ #~ msgstr ""
2818
+
2819
+ #~ msgid "Enable"
2820
+ #~ msgstr ""
2821
+
2822
+ #~ msgid "Placement"
2823
+ #~ msgstr ""
2824
+
2825
+ #~ msgid "Player width [px]"
2826
+ #~ msgstr ""
2827
+
2828
+ #~ msgid "Basic Setup"
2829
+ #~ msgstr ""
2830
+
2831
+ #~ msgid "Installation"
2832
+ #~ msgstr ""
2833
+
2834
+ #~ msgid "Start up guide"
2835
+ #~ msgstr ""
2836
+
2837
+ #~ msgid "Alignment Settings"
2838
+ #~ msgstr ""
2839
+
2840
+ #~ msgid "Customizing FV Player Skin"
2841
+ #~ msgstr ""
2842
+
2843
+ #~ msgid "Sharing Videos on Social Media"
2844
+ #~ msgstr ""
2845
+
2846
+ #~ msgid "Email Sharing"
2847
+ #~ msgstr ""
2848
+
2849
+ #~ msgid "Using the Iframe Embedding"
2850
+ #~ msgstr ""
2851
+
2852
+ #~ msgid "Using the Video Lightbox Effect"
2853
+ #~ msgstr ""
2854
+
2855
+ #~ msgid "Video Encoding for HTML 5"
2856
+ #~ msgstr ""
2857
+
2858
+ #~ msgid "How to Create Playlists"
2859
+ #~ msgstr ""
2860
+
2861
+ #~ msgid "VTT Chapters"
2862
+ #~ msgstr ""
2863
+
2864
+ #~ msgid "Adding Titles and Splash Text"
2865
+ #~ msgstr ""
2866
+
2867
+ #~ msgid "Setting Up Video Quality Switching"
2868
+ #~ msgstr ""
2869
+
2870
+ #~ msgid "How to Use the Built-in Video Checker"
2871
+ #~ msgstr ""
2872
+
2873
+ #~ msgid "Creating Video Links in FV Player"
2874
+ #~ msgstr ""
2875
+
2876
+ #~ msgid "Switching FV Player Pro to Beta"
2877
+ #~ msgstr ""
2878
+
2879
+ #~ msgid "FAQ"
2880
+ #~ msgstr ""
2881
+
2882
+ #~ msgid "WordPress Video Plugins Comparison"
2883
+ #~ msgstr ""
2884
+
2885
+ #~ msgid "List of Shortcode Parameters"
2886
+ #~ msgstr ""
2887
+
2888
+ #~ msgid "Video Hosting"
2889
+ #~ msgstr ""
2890
+
2891
+ #~ msgid "Using YouTube with FV Player"
2892
+ #~ msgstr ""
2893
+
2894
+ #~ msgid "How to Use Vimeo with WordPress"
2895
+ #~ msgstr ""
2896
+
2897
+ #~ msgid "Serving Private Videos with Amazon S3"
2898
+ #~ msgstr ""
2899
+
2900
+ #~ msgid "Serving Private Videos via CloudFront"
2901
+ #~ msgstr ""
2902
+
2903
+ #~ msgid "Using BunnyCDN with FV Player Pro"
2904
+ #~ msgstr ""
2905
+
2906
+ #~ msgid "Using KeyCDN With FV Player"
2907
+ #~ msgstr ""
2908
+
2909
+ #~ msgid "Using HLS With FV Player"
2910
+ #~ msgstr ""
2911
+
2912
+ #~ msgid "Advertising Options with FV Player"
2913
+ #~ msgstr ""
2914
+
2915
+ #~ msgid "Custom Video Ads in FV Player (pre-roll and post-roll)"
2916
+ #~ msgstr ""
2917
+
2918
+ #~ msgid "Overlay Ads in FV Player"
2919
+ #~ msgstr ""
2920
+
2921
+ #~ msgid "Google Video Advertising Options"
2922
+ #~ msgstr ""
2923
+
2924
+ #~ msgid "Incorporating Google Ads (AdSense)"
2925
+ #~ msgstr ""
2926
+
2927
+ #~ msgid "Video Actions: HTML Pop-ups"
2928
+ #~ msgstr ""
2929
+
2930
+ #~ msgid "Using ExoClick Ads With FV Player"
2931
+ #~ msgstr ""
2932
+
2933
+ #~ msgid "Advanced"
2934
+ #~ msgstr ""
2935
+
2936
+ #~ msgid "How to use FV Player Widget"
2937
+ #~ msgstr ""
2938
+
2939
+ #~ msgid "Setting up Video Custom Fields"
2940
+ #~ msgstr ""
2941
+
2942
+ #~ msgid "Using Google Analytics with FV Player"
2943
+ #~ msgstr ""
2944
+
2945
+ #~ msgid "AB Loop Function"
2946
+ #~ msgstr ""
2947
+
2948
+ #~ msgid "How to Create Subtitles"
2949
+ #~ msgstr ""
2950
+
2951
+ #~ msgid "Interactive Video Transcript"
2952
+ #~ msgstr ""
2953
+
2954
+ #~ msgid "How to Use Custom Start/End Time"
2955
+ #~ msgstr ""
2956
+
2957
+ #~ msgid "Sticky Video"
2958
+ #~ msgstr ""
2959
+
2960
+ #~ msgid "CSS Tips and Fixes"
2961
+ #~ msgstr ""
2962
+
2963
+ #~ msgid "Using FV Player with Minify Plugins"
2964
+ #~ msgstr ""
2965
+
2966
+ #~ msgid "How to Use the Speed Buttons"
2967
+ #~ msgstr ""
2968
+
2969
+ #~ msgid "Using FV Player with Sub-domains and Multi-Domains"
2970
+ #~ msgstr ""
2971
+
2972
+ #~ msgid "FV Player Profile Videos"
2973
+ #~ msgstr ""
2974
+
2975
+ #~ msgid "Video Downloading With Simple History Support"
2976
+ #~ msgstr ""
2977
+
2978
+ #~ msgid "Email Subscription Form Pop-ups"
2979
+ #~ msgstr ""
2980
+
2981
+ #~ msgid "Using FV Player With AMP"
2982
+ #~ msgstr ""
2983
+
2984
+ #~ msgid "Programmer&#8217;s Guide"
2985
+ #~ msgstr ""
2986
+
2987
+ #~ msgid "FV WordPress Flowplayer Downgrading"
2988
+ #~ msgstr ""
2989
+
2990
+ #~ msgid "Changelog"
2991
+ #~ msgstr ""
2992
+
2993
+ #~ msgid "Incompatible Plugins and Scripts"
2994
+ #~ msgstr ""
2995
+
2996
+ #~ msgid "Securing Your Video"
2997
+ #~ msgstr ""
2998
+
2999
+ #~ msgid "How to Protect Your Videos from Being Downloaded"
3000
+ #~ msgstr ""
3001
+
3002
+ #~ msgid "How to use RTMP streams with Flash"
3003
+ #~ msgstr ""
3004
+
3005
+ #~ msgid "How to setup encrypted HLS stream with Amazon Elastic Transcoder"
3006
+ #~ msgstr ""
3007
+
3008
+ #~ msgid "Protecting Videos With DRM Text"
3009
+ #~ msgstr ""
3010
+
3011
+ #~ msgid "VAST/VPAID Ads"
3012
+ #~ msgstr ""
3013
+
3014
+ #~ msgid "How to Use FV Player VAST"
3015
+ #~ msgstr ""
3016
+
3017
+ #~ msgid "Using URL Tags"
3018
+ #~ msgstr ""
3019
+
3020
+ #~ msgid "VAST Tester"
3021
+ #~ msgstr ""
3022
+
3023
+ #~ msgid "Tracking VAST and VPAID Ads With Google Analytics"
3024
+ #~ msgstr ""
3025
+
3026
+ #~ msgid "Using FV Player VAST Outside WordPress"
3027
+ #~ msgstr ""
3028
+
3029
+ #~ msgid "List of Sample VAST/VPAID Ad Tags"
3030
+ #~ msgstr ""
3031
+
3032
+ #~ msgid "Remove all data"
3033
+ #~ msgstr ""
3034
+
3035
+ #~ msgid "Tools"
3036
+ #~ msgstr ""
3037
+
3038
+ #~ msgid "Video SEO"
3039
+ #~ msgstr ""
3040
+
3041
+ #~ msgid "Custom CSS"
3042
+ #~ msgstr ""
3043
+
3044
+ #~ msgid "Rollback"
3045
+ #~ msgstr ""
3046
+
3047
+ #~ msgid "Uninstall"
3048
+ #~ msgstr ""
3049
+
3050
+ #~ msgid "Check license"
3051
+ #~ msgstr ""
3052
+
3053
+ #~ msgid "Embeds"
3054
+ #~ msgstr ""
3055
+
3056
+ #~ msgid "FV Player Pro is required to use this video type in playlist."
3057
+ #~ msgstr ""
3058
+
3059
+ #~ msgid "Title"
3060
+ #~ msgstr ""
3061
+
3062
+ #~ msgid "DVR stream"
3063
+ #~ msgstr ""
3064
+
3065
+ #~ msgid "Audio stream"
3066
+ #~ msgstr ""
3067
+
3068
+ #~ msgid "Pick existing player"
3069
+ #~ msgstr ""
languages/fv-wordpress-flowplayer-de_DE.mo CHANGED
Binary file
languages/fv-wordpress-flowplayer-de_DE.po CHANGED
@@ -1,15 +1,17 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV WordPress Flowplayer v.6.0.3.4\n"
4
- "POT-Creation-Date: 2017-08-07 14:20+0200\n"
5
- "PO-Revision-Date: 2017-08-07 14:20+0200\n"
 
6
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
7
  "Language-Team: \n"
8
  "Language: de\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.11\n"
 
13
  "X-Poedit-KeywordsList: __;_e;_n\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
@@ -2214,6 +2216,27 @@ msgstr ""
2214
  msgid "Ad Size"
2215
  msgstr ""
2216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2217
  #~ msgid ""
2218
  #~ "FV Wordpress Flowplayer has found old shortcodes in the content of your "
2219
  #~ "posts. <a href=\"%1$s\">Run the conversion script.</a>"
@@ -2405,20 +2428,617 @@ msgstr ""
2405
  #~ msgid "HTML Popup"
2406
  #~ msgstr "HTML popup-meldung"
2407
 
2408
- msgid "All"
2409
- msgstr "Alles"
 
2410
 
2411
- msgid "Play All"
2412
- msgstr ""
2413
 
2414
- msgid "Replay Playlist"
2415
- msgstr ""
2416
 
2417
- msgid "Repeat Track"
2418
- msgstr ""
2419
 
2420
- msgid "Shuffle Playlist"
2421
- msgstr ""
 
2422
 
2423
- msgid "Item %d."
2424
- msgstr "Liste %d."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV WordPress Flowplayer v.6.0.3.4\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2021-10-21 10:28+0100\n"
6
+ "PO-Revision-Date: 2021-10-21 10:28+0100\n"
7
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
8
  "Language-Team: \n"
9
  "Language: de\n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: \n"
14
+ "X-Generator: Eazy Po 0.9.5.3\n"
15
  "X-Poedit-KeywordsList: __;_e;_n\n"
16
  "X-Poedit-Basepath: ..\n"
17
  "X-Poedit-SourceCharset: UTF-8\n"
2216
  msgid "Ad Size"
2217
  msgstr ""
2218
 
2219
+ msgid "All"
2220
+ msgstr "Alles"
2221
+
2222
+ msgid "Play All"
2223
+ msgstr ""
2224
+
2225
+ msgid "Replay Playlist"
2226
+ msgstr ""
2227
+
2228
+ msgid "Repeat Track"
2229
+ msgstr ""
2230
+
2231
+ msgid "Shuffle Playlist"
2232
+ msgstr ""
2233
+
2234
+ msgid "Item %d."
2235
+ msgstr "Liste %d."
2236
+
2237
+ msgid "Click to unmute"
2238
+ msgstr "Ton aktivieren"
2239
+
2240
  #~ msgid ""
2241
  #~ "FV Wordpress Flowplayer has found old shortcodes in the content of your "
2242
  #~ "posts. <a href=\"%1$s\">Run the conversion script.</a>"
2428
  #~ msgid "HTML Popup"
2429
  #~ msgstr "HTML popup-meldung"
2430
 
2431
+ #, php-format
2432
+ #~ msgid "FV Player: Please upgrade to FV Player Pro version %s or above!"
2433
+ #~ msgstr ""
2434
 
2435
+ #~ msgid "Embed feature not supported in editor preview"
2436
+ #~ msgstr ""
2437
 
2438
+ #~ msgid "Link feature not supported in editor preview"
2439
+ #~ msgstr ""
2440
 
2441
+ #~ msgid "Video loading has stalled, click to reload"
2442
+ #~ msgstr ""
2443
 
2444
+ #, php-format
2445
+ #~ msgid "<h2>Live stream scheduled</h2><p>Starting in <span>%d</span>.</p>"
2446
+ #~ msgstr ""
2447
 
2448
+ #, php-format
2449
+ #~ msgid "%s day"
2450
+ #~ msgid_plural "%s days"
2451
+ #~ msgstr[0] ""
2452
+ #~ msgstr[1] ""
2453
+
2454
+ #, php-format
2455
+ #~ msgid "%s hour"
2456
+ #~ msgid_plural "%s hours"
2457
+ #~ msgstr[0] ""
2458
+ #~ msgstr[1] ""
2459
+
2460
+ #, php-format
2461
+ #~ msgid "%s min"
2462
+ #~ msgid_plural "%s mins"
2463
+ #~ msgstr[0] ""
2464
+ #~ msgstr[1] ""
2465
+
2466
+ #, php-format
2467
+ #~ msgid "%s second"
2468
+ #~ msgid_plural "%s seconds"
2469
+ #~ msgstr[0] ""
2470
+ #~ msgstr[1] ""
2471
+
2472
+ #, php-format
2473
+ #~ msgid "%1$s and %2$s"
2474
+ #~ msgstr ""
2475
+
2476
+ #~ msgid "FV Player 7.5"
2477
+ #~ msgstr ""
2478
+
2479
+ #~ msgid "Thanks for letting me know!"
2480
+ #~ msgstr ""
2481
+
2482
+ #~ msgid "FV Player Video Lightbox"
2483
+ #~ msgstr ""
2484
+
2485
+ #~ msgid "FV Player database storage is here!"
2486
+ #~ msgstr ""
2487
+
2488
+ #~ msgid "FV Player Video Sitemap coverage"
2489
+ #~ msgstr ""
2490
+
2491
+ #~ msgid "Go to setting"
2492
+ #~ msgstr ""
2493
+
2494
+ #~ msgid "FV Player 7"
2495
+ #~ msgstr ""
2496
+
2497
+ #~ msgid "Africa (Cape Town)"
2498
+ #~ msgstr ""
2499
+
2500
+ #~ msgid "Asia Pacific (Hong Kong)"
2501
+ #~ msgstr ""
2502
+
2503
+ #~ msgid "Asia Pacific (Osaka-Local)"
2504
+ #~ msgstr ""
2505
+
2506
+ #~ msgid "China (Beijing)"
2507
+ #~ msgstr ""
2508
+
2509
+ #~ msgid "China (Ningxia)"
2510
+ #~ msgstr ""
2511
+
2512
+ #~ msgid "Europe (Frankfurt)"
2513
+ #~ msgstr ""
2514
+
2515
+ #~ msgid "Europe (Ireland)"
2516
+ #~ msgstr ""
2517
+
2518
+ #~ msgid "Europe (London)"
2519
+ #~ msgstr ""
2520
+
2521
+ #~ msgid "Europe (Milan)"
2522
+ #~ msgstr ""
2523
+
2524
+ #~ msgid "Europe (Paris)"
2525
+ #~ msgstr ""
2526
+
2527
+ #~ msgid "Europe (Stockholm)"
2528
+ #~ msgstr ""
2529
+
2530
+ #~ msgid "Middle East (Bahrain)"
2531
+ #~ msgstr ""
2532
+
2533
+ #~ msgid "An unknown error occurred"
2534
+ #~ msgstr ""
2535
+
2536
+ #~ msgid " extension installed successfully!"
2537
+ #~ msgstr ""
2538
+
2539
+ #~ msgid " extension install failed - "
2540
+ #~ msgstr ""
2541
+
2542
+ #~ msgid " extension upgraded successfully!"
2543
+ #~ msgstr ""
2544
+
2545
+ #~ msgid "Domain"
2546
+ #~ msgstr ""
2547
+
2548
+ #~ msgid "You can enter multiple domains separated by <code>,</code>."
2549
+ #~ msgstr ""
2550
+
2551
+ #~ msgid "Secure Token"
2552
+ #~ msgstr ""
2553
+
2554
+ #~ msgid "Draft"
2555
+ #~ msgstr ""
2556
+
2557
+ #~ msgid "Remove fancyBox"
2558
+ #~ msgstr ""
2559
+
2560
+ #~ msgid "Your gallery items will link to image files directly to allow this."
2561
+ #~ msgstr ""
2562
+
2563
+ #~ msgid "Player Name"
2564
+ #~ msgstr ""
2565
+
2566
+ #~ msgid "Date"
2567
+ #~ msgstr ""
2568
+
2569
+ #~ msgid "Author"
2570
+ #~ msgstr ""
2571
+
2572
+ #~ msgid "Chapters"
2573
+ #~ msgstr ""
2574
+
2575
+ #~ msgid "Transcript"
2576
+ #~ msgstr ""
2577
+
2578
+ #~ msgid "Embedded on"
2579
+ #~ msgstr ""
2580
+
2581
+ #~ msgid "Plays"
2582
+ #~ msgstr ""
2583
+
2584
+ #~ msgid "Players per page"
2585
+ #~ msgstr ""
2586
+
2587
+ #~ msgid "no region"
2588
+ #~ msgstr ""
2589
+
2590
+ #~ msgid "Remember video position"
2591
+ #~ msgstr ""
2592
+
2593
+ #~ msgid "Video Stats"
2594
+ #~ msgstr ""
2595
+
2596
+ #~ msgid "Gives you a daily count of video plays."
2597
+ #~ msgstr ""
2598
+
2599
+ #~ msgid "System Info"
2600
+ #~ msgstr ""
2601
+
2602
+ #~ msgid "Install"
2603
+ #~ msgstr ""
2604
+
2605
+ #~ msgid "Reset"
2606
+ #~ msgstr ""
2607
+
2608
+ #~ msgid "Login"
2609
+ #~ msgstr ""
2610
+
2611
+ #~ msgid "Password"
2612
+ #~ msgstr ""
2613
+
2614
+ #~ msgid "Sign in"
2615
+ #~ msgstr ""
2616
+
2617
+ #~ msgid "Hide the vi Ads tab"
2618
+ #~ msgstr ""
2619
+
2620
+ #~ msgid "video intelligence"
2621
+ #~ msgstr ""
2622
+
2623
+ #~ msgid "Account"
2624
+ #~ msgstr ""
2625
+
2626
+ #~ msgid "Hide vi Ads"
2627
+ #~ msgstr ""
2628
+
2629
+ #~ msgid "Free video intelligence ads"
2630
+ #~ msgstr ""
2631
+
2632
+ #~ msgid "Show the vi Ads tab again"
2633
+ #~ msgstr ""
2634
+
2635
+ #~ msgid "vi Ads"
2636
+ #~ msgstr ""
2637
+
2638
+ #~ msgid "Use XML Video Sitemap"
2639
+ #~ msgstr ""
2640
+
2641
+ #~ msgid "Sitemap Post Meta"
2642
+ #~ msgstr ""
2643
+
2644
+ #~ msgid "Amazon S3 Browser"
2645
+ #~ msgstr ""
2646
+
2647
+ #~ msgid "Show Amazon S3 Browser in the \"Add Video\" dialog."
2648
+ #~ msgstr ""
2649
+
2650
+ #~ msgid "Controlbar Always Visible"
2651
+ #~ msgstr ""
2652
+
2653
+ #~ msgid "Enter values in pixels or 100%."
2654
+ #~ msgstr ""
2655
+
2656
+ #~ msgid "Enable Chromecast"
2657
+ #~ msgstr ""
2658
+
2659
+ #~ msgid "Adds support for Google Chromecast."
2660
+ #~ msgstr ""
2661
+
2662
+ #~ msgid "Force HD Streaming"
2663
+ #~ msgstr ""
2664
+
2665
+ #~ msgid "Use HD quality for HLS/MPEG-DASH even on slow connections."
2666
+ #~ msgstr ""
2667
+
2668
+ #~ msgid "Matomo/Piwik Tracking"
2669
+ #~ msgstr ""
2670
+
2671
+ #~ msgid "matomo.your-domain.com"
2672
+ #~ msgstr ""
2673
+
2674
+ #~ msgid "Site ID"
2675
+ #~ msgstr ""
2676
+
2677
+ #~ msgid "Multiple video playback"
2678
+ #~ msgstr ""
2679
+
2680
+ #~ msgid "No Picture Button"
2681
+ #~ msgstr ""
2682
+
2683
+ #~ msgid "Adds a button to turn the video picture on and off."
2684
+ #~ msgstr ""
2685
+
2686
+ #~ msgid "Slider"
2687
+ #~ msgstr ""
2688
+
2689
+ #~ msgid "Vertical Season"
2690
+ #~ msgstr ""
2691
+
2692
+ #~ msgid "Polaroid"
2693
+ #~ msgstr ""
2694
+
2695
+ #~ msgid "Text"
2696
+ #~ msgstr ""
2697
+
2698
+ #~ msgid "Repeat Button"
2699
+ #~ msgstr ""
2700
+
2701
+ #~ msgid "Adds a button to set playlist/track repeat and shuffle."
2702
+ #~ msgstr ""
2703
+
2704
+ #~ msgid "Rewind/Forward Button"
2705
+ #~ msgstr ""
2706
+
2707
+ #~ msgid "Adds a button to go 10 seconds back/forth."
2708
+ #~ msgstr ""
2709
+
2710
+ #~ msgid "Maintenance tools and debug info."
2711
+ #~ msgstr ""
2712
+
2713
+ #~ msgid "Disable saving skin CSS to a static file"
2714
+ #~ msgstr ""
2715
+
2716
+ #~ msgid "Handle WordPress audio/video"
2717
+ #~ msgstr ""
2718
+
2719
+ #~ msgid "Optimize FV Flowplayer JS loading"
2720
+ #~ msgstr ""
2721
+
2722
+ #~ msgid "Helps with Google PageSpeed scores."
2723
+ #~ msgstr ""
2724
+
2725
+ #~ msgid "Alternative iOS fullscreen mode"
2726
+ #~ msgstr ""
2727
+
2728
+ #~ msgid "Force landscape orientation in fullscreen"
2729
+ #~ msgstr ""
2730
+
2731
+ #~ msgid "Works on the Android mobile, not supported on iOS unfortunately."
2732
+ #~ msgstr ""
2733
+
2734
+ #~ msgid " Adds the video meta data information for search engines."
2735
+ #~ msgstr ""
2736
+
2737
+ #~ msgid "Show on pause"
2738
+ #~ msgstr ""
2739
+
2740
+ #~ msgid "Playlist Item Titles"
2741
+ #~ msgstr ""
2742
+
2743
+ #~ msgid "Splash Text"
2744
+ #~ msgstr ""
2745
+
2746
+ #~ msgid "Sticky"
2747
+ #~ msgstr ""
2748
+
2749
+ #~ msgid "Synopsis"
2750
+ #~ msgstr ""
2751
+
2752
+ #~ msgid "Color"
2753
+ #~ msgstr ""
2754
+
2755
+ #~ msgid "Controlbar Fullscreen"
2756
+ #~ msgstr ""
2757
+
2758
+ #~ msgid "Enter value in em"
2759
+ #~ msgstr ""
2760
+
2761
+ #~ msgid "Buttons"
2762
+ #~ msgstr ""
2763
+
2764
+ #~ msgid "Slim"
2765
+ #~ msgstr ""
2766
+
2767
+ #~ msgid "Full"
2768
+ #~ msgstr ""
2769
+
2770
+ #~ msgid "Fat"
2771
+ #~ msgstr ""
2772
+
2773
+ #~ msgid "Minimal"
2774
+ #~ msgstr ""
2775
+
2776
+ #~ msgid "Icons"
2777
+ #~ msgstr ""
2778
+
2779
+ #~ msgid "Edgy"
2780
+ #~ msgstr ""
2781
+
2782
+ #~ msgid "Outlined"
2783
+ #~ msgstr ""
2784
+
2785
+ #~ msgid "Playful"
2786
+ #~ msgstr ""
2787
+
2788
+ #~ msgid "(inherit from player)"
2789
+ #~ msgstr ""
2790
+
2791
+ #~ msgid "Second line."
2792
+ #~ msgstr ""
2793
+
2794
+ #~ msgid "Enable"
2795
+ #~ msgstr ""
2796
+
2797
+ #~ msgid "Placement"
2798
+ #~ msgstr ""
2799
+
2800
+ #~ msgid "Player width [px]"
2801
+ #~ msgstr ""
2802
+
2803
+ #~ msgid "Basic Setup"
2804
+ #~ msgstr ""
2805
+
2806
+ #~ msgid "Installation"
2807
+ #~ msgstr ""
2808
+
2809
+ #~ msgid "Start up guide"
2810
+ #~ msgstr ""
2811
+
2812
+ #~ msgid "Alignment Settings"
2813
+ #~ msgstr ""
2814
+
2815
+ #~ msgid "Customizing FV Player Skin"
2816
+ #~ msgstr ""
2817
+
2818
+ #~ msgid "Sharing Videos on Social Media"
2819
+ #~ msgstr ""
2820
+
2821
+ #~ msgid "Email Sharing"
2822
+ #~ msgstr ""
2823
+
2824
+ #~ msgid "Using the Iframe Embedding"
2825
+ #~ msgstr ""
2826
+
2827
+ #~ msgid "Using the Video Lightbox Effect"
2828
+ #~ msgstr ""
2829
+
2830
+ #~ msgid "Video Encoding for HTML 5"
2831
+ #~ msgstr ""
2832
+
2833
+ #~ msgid "How to Create Playlists"
2834
+ #~ msgstr ""
2835
+
2836
+ #~ msgid "VTT Chapters"
2837
+ #~ msgstr ""
2838
+
2839
+ #~ msgid "Adding Titles and Splash Text"
2840
+ #~ msgstr ""
2841
+
2842
+ #~ msgid "Setting Up Video Quality Switching"
2843
+ #~ msgstr ""
2844
+
2845
+ #~ msgid "How to Use the Built-in Video Checker"
2846
+ #~ msgstr ""
2847
+
2848
+ #~ msgid "Creating Video Links in FV Player"
2849
+ #~ msgstr ""
2850
+
2851
+ #~ msgid "Switching FV Player Pro to Beta"
2852
+ #~ msgstr ""
2853
+
2854
+ #~ msgid "FAQ"
2855
+ #~ msgstr ""
2856
+
2857
+ #~ msgid "WordPress Video Plugins Comparison"
2858
+ #~ msgstr ""
2859
+
2860
+ #~ msgid "List of Shortcode Parameters"
2861
+ #~ msgstr ""
2862
+
2863
+ #~ msgid "Video Hosting"
2864
+ #~ msgstr ""
2865
+
2866
+ #~ msgid "Using YouTube with FV Player"
2867
+ #~ msgstr ""
2868
+
2869
+ #~ msgid "How to Use Vimeo with WordPress"
2870
+ #~ msgstr ""
2871
+
2872
+ #~ msgid "Serving Private Videos with Amazon S3"
2873
+ #~ msgstr ""
2874
+
2875
+ #~ msgid "Serving Private Videos via CloudFront"
2876
+ #~ msgstr ""
2877
+
2878
+ #~ msgid "Using BunnyCDN with FV Player Pro"
2879
+ #~ msgstr ""
2880
+
2881
+ #~ msgid "Using KeyCDN With FV Player"
2882
+ #~ msgstr ""
2883
+
2884
+ #~ msgid "Using HLS With FV Player"
2885
+ #~ msgstr ""
2886
+
2887
+ #~ msgid "Advertising Options with FV Player"
2888
+ #~ msgstr ""
2889
+
2890
+ #~ msgid "Custom Video Ads in FV Player (pre-roll and post-roll)"
2891
+ #~ msgstr ""
2892
+
2893
+ #~ msgid "Overlay Ads in FV Player"
2894
+ #~ msgstr ""
2895
+
2896
+ #~ msgid "Google Video Advertising Options"
2897
+ #~ msgstr ""
2898
+
2899
+ #~ msgid "Incorporating Google Ads (AdSense)"
2900
+ #~ msgstr ""
2901
+
2902
+ #~ msgid "Video Actions: HTML Pop-ups"
2903
+ #~ msgstr ""
2904
+
2905
+ #~ msgid "Using ExoClick Ads With FV Player"
2906
+ #~ msgstr ""
2907
+
2908
+ #~ msgid "Advanced"
2909
+ #~ msgstr ""
2910
+
2911
+ #~ msgid "How to use FV Player Widget"
2912
+ #~ msgstr ""
2913
+
2914
+ #~ msgid "Setting up Video Custom Fields"
2915
+ #~ msgstr ""
2916
+
2917
+ #~ msgid "Using Google Analytics with FV Player"
2918
+ #~ msgstr ""
2919
+
2920
+ #~ msgid "AB Loop Function"
2921
+ #~ msgstr ""
2922
+
2923
+ #~ msgid "How to Create Subtitles"
2924
+ #~ msgstr ""
2925
+
2926
+ #~ msgid "Interactive Video Transcript"
2927
+ #~ msgstr ""
2928
+
2929
+ #~ msgid "How to Use Custom Start/End Time"
2930
+ #~ msgstr ""
2931
+
2932
+ #~ msgid "Sticky Video"
2933
+ #~ msgstr ""
2934
+
2935
+ #~ msgid "CSS Tips and Fixes"
2936
+ #~ msgstr ""
2937
+
2938
+ #~ msgid "Using FV Player with Minify Plugins"
2939
+ #~ msgstr ""
2940
+
2941
+ #~ msgid "How to Use the Speed Buttons"
2942
+ #~ msgstr ""
2943
+
2944
+ #~ msgid "Using FV Player with Sub-domains and Multi-Domains"
2945
+ #~ msgstr ""
2946
+
2947
+ #~ msgid "FV Player Profile Videos"
2948
+ #~ msgstr ""
2949
+
2950
+ #~ msgid "Video Downloading With Simple History Support"
2951
+ #~ msgstr ""
2952
+
2953
+ #~ msgid "Email Subscription Form Pop-ups"
2954
+ #~ msgstr ""
2955
+
2956
+ #~ msgid "Using FV Player With AMP"
2957
+ #~ msgstr ""
2958
+
2959
+ #~ msgid "Programmer&#8217;s Guide"
2960
+ #~ msgstr ""
2961
+
2962
+ #~ msgid "FV WordPress Flowplayer Downgrading"
2963
+ #~ msgstr ""
2964
+
2965
+ #~ msgid "Changelog"
2966
+ #~ msgstr ""
2967
+
2968
+ #~ msgid "Incompatible Plugins and Scripts"
2969
+ #~ msgstr ""
2970
+
2971
+ #~ msgid "Securing Your Video"
2972
+ #~ msgstr ""
2973
+
2974
+ #~ msgid "How to Protect Your Videos from Being Downloaded"
2975
+ #~ msgstr ""
2976
+
2977
+ #~ msgid "How to use RTMP streams with Flash"
2978
+ #~ msgstr ""
2979
+
2980
+ #~ msgid "How to setup encrypted HLS stream with Amazon Elastic Transcoder"
2981
+ #~ msgstr ""
2982
+
2983
+ #~ msgid "Protecting Videos With DRM Text"
2984
+ #~ msgstr ""
2985
+
2986
+ #~ msgid "VAST/VPAID Ads"
2987
+ #~ msgstr ""
2988
+
2989
+ #~ msgid "How to Use FV Player VAST"
2990
+ #~ msgstr ""
2991
+
2992
+ #~ msgid "Using URL Tags"
2993
+ #~ msgstr ""
2994
+
2995
+ #~ msgid "VAST Tester"
2996
+ #~ msgstr ""
2997
+
2998
+ #~ msgid "Tracking VAST and VPAID Ads With Google Analytics"
2999
+ #~ msgstr ""
3000
+
3001
+ #~ msgid "Using FV Player VAST Outside WordPress"
3002
+ #~ msgstr ""
3003
+
3004
+ #~ msgid "List of Sample VAST/VPAID Ad Tags"
3005
+ #~ msgstr ""
3006
+
3007
+ #~ msgid "Remove all data"
3008
+ #~ msgstr ""
3009
+
3010
+ #~ msgid "Tools"
3011
+ #~ msgstr ""
3012
+
3013
+ #~ msgid "Video SEO"
3014
+ #~ msgstr ""
3015
+
3016
+ #~ msgid "Custom CSS"
3017
+ #~ msgstr ""
3018
+
3019
+ #~ msgid "Rollback"
3020
+ #~ msgstr ""
3021
+
3022
+ #~ msgid "Uninstall"
3023
+ #~ msgstr ""
3024
+
3025
+ #~ msgid "Check license"
3026
+ #~ msgstr ""
3027
+
3028
+ #~ msgid "Embeds"
3029
+ #~ msgstr ""
3030
+
3031
+ #~ msgid "FV Player Pro is required to use this video type in playlist."
3032
+ #~ msgstr ""
3033
+
3034
+ #~ msgid "Title"
3035
+ #~ msgstr ""
3036
+
3037
+ #~ msgid "DVR stream"
3038
+ #~ msgstr ""
3039
+
3040
+ #~ msgid "Audio stream"
3041
+ #~ msgstr ""
3042
+
3043
+ #~ msgid "Pick existing player"
3044
+ #~ msgstr ""
languages/fv-wordpress-flowplayer-es_ES.mo CHANGED
Binary file
languages/fv-wordpress-flowplayer-es_ES.po CHANGED
@@ -1,15 +1,17 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV WordPress Flowplayer v.6.0.3.4\n"
4
- "POT-Creation-Date: 2017-08-07 14:21+0200\n"
5
- "PO-Revision-Date: 2017-08-07 14:21+0200\n"
 
6
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
7
  "Language-Team: \n"
8
  "Language: es_ES\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.11\n"
 
13
  "X-Poedit-KeywordsList: __;_e;_n\n"
14
  "X-Poedit-Basepath: .\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
@@ -1446,6 +1448,8 @@ msgid "Embed"
1446
  msgstr "Insertar"
1447
 
1448
  #: ../view/admin.php:802
 
 
1449
  msgid "Live Stream"
1450
  msgstr ""
1451
 
@@ -2207,6 +2211,28 @@ msgstr ""
2207
  msgid "Ad Size"
2208
  msgstr ""
2209
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2210
  #~ msgid ""
2211
  #~ "FV Wordpress Flowplayer has found old shortcodes in the content of your "
2212
  #~ "posts. <a href=\"%1$s\">Run the conversion script.</a>"
@@ -2346,20 +2372,613 @@ msgstr ""
2346
  #~ msgid "Thank you for purchasing FV Player license!"
2347
  #~ msgstr "Gracias por la compra FV Player de licencia!"
2348
 
2349
- msgid "All"
2350
- msgstr "Todos"
 
2351
 
2352
- msgid "Play All"
2353
- msgstr ""
2354
 
2355
- msgid "Replay Playlist"
2356
- msgstr ""
2357
 
2358
- msgid "Repeat Track"
2359
- msgstr ""
2360
 
2361
- msgid "Shuffle Playlist"
2362
- msgstr ""
 
 
 
2363
 
2364
- msgid "Item %d."
2365
- msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV WordPress Flowplayer v.6.0.3.4\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2021-10-21 10:27+0100\n"
6
+ "PO-Revision-Date: 2021-10-21 10:27+0100\n"
7
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
8
  "Language-Team: \n"
9
  "Language: es_ES\n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: \n"
14
+ "X-Generator: Eazy Po 0.9.5.3\n"
15
  "X-Poedit-KeywordsList: __;_e;_n\n"
16
  "X-Poedit-Basepath: .\n"
17
  "X-Poedit-SourceCharset: UTF-8\n"
1448
  msgstr "Insertar"
1449
 
1450
  #: ../view/admin.php:802
1451
+ #, fuzzy
1452
+ #| msgid "Live stream"
1453
  msgid "Live Stream"
1454
  msgstr ""
1455
 
2211
  msgid "Ad Size"
2212
  msgstr ""
2213
 
2214
+ msgid "All"
2215
+ msgstr "Todos"
2216
+
2217
+ msgid "Play All"
2218
+ msgstr ""
2219
+
2220
+ msgid "Replay Playlist"
2221
+ msgstr ""
2222
+
2223
+ msgid "Repeat Track"
2224
+ msgstr ""
2225
+
2226
+ msgid "Shuffle Playlist"
2227
+ msgstr ""
2228
+
2229
+ #,
2230
+ msgid "Item %d."
2231
+ msgstr ""
2232
+
2233
+ msgid "Click to unmute"
2234
+ msgstr ""
2235
+
2236
  #~ msgid ""
2237
  #~ "FV Wordpress Flowplayer has found old shortcodes in the content of your "
2238
  #~ "posts. <a href=\"%1$s\">Run the conversion script.</a>"
2372
  #~ msgid "Thank you for purchasing FV Player license!"
2373
  #~ msgstr "Gracias por la compra FV Player de licencia!"
2374
 
2375
+ #, php-format
2376
+ #~ msgid "FV Player: Please upgrade to FV Player Pro version %s or above!"
2377
+ #~ msgstr ""
2378
 
2379
+ #~ msgid "Embed feature not supported in editor preview"
2380
+ #~ msgstr ""
2381
 
2382
+ #~ msgid "Link feature not supported in editor preview"
2383
+ #~ msgstr ""
2384
 
2385
+ #~ msgid "Video loading has stalled, click to reload"
2386
+ #~ msgstr ""
2387
 
2388
+ #, php-format
2389
+ #~ msgid "%s day"
2390
+ #~ msgid_plural "%s days"
2391
+ #~ msgstr[0] ""
2392
+ #~ msgstr[1] ""
2393
 
2394
+ #, php-format
2395
+ #~ msgid "%s hour"
2396
+ #~ msgid_plural "%s hours"
2397
+ #~ msgstr[0] ""
2398
+ #~ msgstr[1] ""
2399
+
2400
+ #, php-format
2401
+ #~ msgid "%s min"
2402
+ #~ msgid_plural "%s mins"
2403
+ #~ msgstr[0] ""
2404
+ #~ msgstr[1] ""
2405
+
2406
+ #, php-format
2407
+ #~ msgid "%s second"
2408
+ #~ msgid_plural "%s seconds"
2409
+ #~ msgstr[0] ""
2410
+ #~ msgstr[1] ""
2411
+
2412
+ #, php-format
2413
+ #~ msgid "%1$s and %2$s"
2414
+ #~ msgstr ""
2415
+
2416
+ #~ msgid "FV Player 7.5"
2417
+ #~ msgstr ""
2418
+
2419
+ #~ msgid "Thanks for letting me know!"
2420
+ #~ msgstr ""
2421
+
2422
+ #~ msgid "FV Player Video Lightbox"
2423
+ #~ msgstr ""
2424
+
2425
+ #~ msgid "FV Player database storage is here!"
2426
+ #~ msgstr ""
2427
+
2428
+ #~ msgid "FV Player Video Sitemap coverage"
2429
+ #~ msgstr ""
2430
+
2431
+ #~ msgid "Go to setting"
2432
+ #~ msgstr ""
2433
+
2434
+ #~ msgid "FV Player 7"
2435
+ #~ msgstr ""
2436
+
2437
+ #~ msgid "Africa (Cape Town)"
2438
+ #~ msgstr ""
2439
+
2440
+ #~ msgid "Asia Pacific (Hong Kong)"
2441
+ #~ msgstr ""
2442
+
2443
+ #~ msgid "Asia Pacific (Osaka-Local)"
2444
+ #~ msgstr ""
2445
+
2446
+ #~ msgid "China (Beijing)"
2447
+ #~ msgstr ""
2448
+
2449
+ #~ msgid "China (Ningxia)"
2450
+ #~ msgstr ""
2451
+
2452
+ #~ msgid "Europe (Frankfurt)"
2453
+ #~ msgstr ""
2454
+
2455
+ #~ msgid "Europe (Ireland)"
2456
+ #~ msgstr ""
2457
+
2458
+ #~ msgid "Europe (London)"
2459
+ #~ msgstr ""
2460
+
2461
+ #~ msgid "Europe (Milan)"
2462
+ #~ msgstr ""
2463
+
2464
+ #~ msgid "Europe (Paris)"
2465
+ #~ msgstr ""
2466
+
2467
+ #~ msgid "Europe (Stockholm)"
2468
+ #~ msgstr ""
2469
+
2470
+ #~ msgid "Middle East (Bahrain)"
2471
+ #~ msgstr ""
2472
+
2473
+ #~ msgid "An unknown error occurred"
2474
+ #~ msgstr ""
2475
+
2476
+ #~ msgid " extension installed successfully!"
2477
+ #~ msgstr ""
2478
+
2479
+ #~ msgid " extension install failed - "
2480
+ #~ msgstr ""
2481
+
2482
+ #~ msgid " extension upgraded successfully!"
2483
+ #~ msgstr ""
2484
+
2485
+ #~ msgid "Domain"
2486
+ #~ msgstr ""
2487
+
2488
+ #~ msgid "You can enter multiple domains separated by <code>,</code>."
2489
+ #~ msgstr ""
2490
+
2491
+ #~ msgid "Secure Token"
2492
+ #~ msgstr ""
2493
+
2494
+ #~ msgid "Draft"
2495
+ #~ msgstr ""
2496
+
2497
+ #~ msgid "Remove fancyBox"
2498
+ #~ msgstr ""
2499
+
2500
+ #~ msgid "Your gallery items will link to image files directly to allow this."
2501
+ #~ msgstr ""
2502
+
2503
+ #~ msgid "Player Name"
2504
+ #~ msgstr ""
2505
+
2506
+ #~ msgid "Date"
2507
+ #~ msgstr ""
2508
+
2509
+ #~ msgid "Author"
2510
+ #~ msgstr ""
2511
+
2512
+ #~ msgid "Chapters"
2513
+ #~ msgstr ""
2514
+
2515
+ #~ msgid "Transcript"
2516
+ #~ msgstr ""
2517
+
2518
+ #~ msgid "Embedded on"
2519
+ #~ msgstr ""
2520
+
2521
+ #~ msgid "Plays"
2522
+ #~ msgstr ""
2523
+
2524
+ #~ msgid "Players per page"
2525
+ #~ msgstr ""
2526
+
2527
+ #~ msgid "no region"
2528
+ #~ msgstr ""
2529
+
2530
+ #~ msgid "Remember video position"
2531
+ #~ msgstr ""
2532
+
2533
+ #~ msgid "Video Stats"
2534
+ #~ msgstr ""
2535
+
2536
+ #~ msgid "Gives you a daily count of video plays."
2537
+ #~ msgstr ""
2538
+
2539
+ #~ msgid "System Info"
2540
+ #~ msgstr ""
2541
+
2542
+ #~ msgid "Install"
2543
+ #~ msgstr ""
2544
+
2545
+ #~ msgid "Reset"
2546
+ #~ msgstr ""
2547
+
2548
+ #~ msgid "Login"
2549
+ #~ msgstr ""
2550
+
2551
+ #~ msgid "Password"
2552
+ #~ msgstr ""
2553
+
2554
+ #~ msgid "Sign in"
2555
+ #~ msgstr ""
2556
+
2557
+ #~ msgid "Hide the vi Ads tab"
2558
+ #~ msgstr ""
2559
+
2560
+ #~ msgid "video intelligence"
2561
+ #~ msgstr ""
2562
+
2563
+ #~ msgid "Account"
2564
+ #~ msgstr ""
2565
+
2566
+ #~ msgid "Hide vi Ads"
2567
+ #~ msgstr ""
2568
+
2569
+ #~ msgid "Free video intelligence ads"
2570
+ #~ msgstr ""
2571
+
2572
+ #~ msgid "Show the vi Ads tab again"
2573
+ #~ msgstr ""
2574
+
2575
+ #~ msgid "vi Ads"
2576
+ #~ msgstr ""
2577
+
2578
+ #~ msgid "Use XML Video Sitemap"
2579
+ #~ msgstr ""
2580
+
2581
+ #~ msgid "Sitemap Post Meta"
2582
+ #~ msgstr ""
2583
+
2584
+ #~ msgid "Amazon S3 Browser"
2585
+ #~ msgstr ""
2586
+
2587
+ #~ msgid "Show Amazon S3 Browser in the \"Add Video\" dialog."
2588
+ #~ msgstr ""
2589
+
2590
+ #~ msgid "Controlbar Always Visible"
2591
+ #~ msgstr ""
2592
+
2593
+ #~ msgid "Enter values in pixels or 100%."
2594
+ #~ msgstr ""
2595
+
2596
+ #~ msgid "Enable Chromecast"
2597
+ #~ msgstr ""
2598
+
2599
+ #~ msgid "Adds support for Google Chromecast."
2600
+ #~ msgstr ""
2601
+
2602
+ #~ msgid "Force HD Streaming"
2603
+ #~ msgstr ""
2604
+
2605
+ #~ msgid "Use HD quality for HLS/MPEG-DASH even on slow connections."
2606
+ #~ msgstr ""
2607
+
2608
+ #~ msgid "Matomo/Piwik Tracking"
2609
+ #~ msgstr ""
2610
+
2611
+ #~ msgid "matomo.your-domain.com"
2612
+ #~ msgstr ""
2613
+
2614
+ #~ msgid "Site ID"
2615
+ #~ msgstr ""
2616
+
2617
+ #~ msgid "Multiple video playback"
2618
+ #~ msgstr ""
2619
+
2620
+ #~ msgid "No Picture Button"
2621
+ #~ msgstr ""
2622
+
2623
+ #~ msgid "Adds a button to turn the video picture on and off."
2624
+ #~ msgstr ""
2625
+
2626
+ #~ msgid "Slider"
2627
+ #~ msgstr ""
2628
+
2629
+ #~ msgid "Vertical Season"
2630
+ #~ msgstr ""
2631
+
2632
+ #~ msgid "Polaroid"
2633
+ #~ msgstr ""
2634
+
2635
+ #~ msgid "Text"
2636
+ #~ msgstr ""
2637
+
2638
+ #~ msgid "Repeat Button"
2639
+ #~ msgstr ""
2640
+
2641
+ #~ msgid "Adds a button to set playlist/track repeat and shuffle."
2642
+ #~ msgstr ""
2643
+
2644
+ #~ msgid "Rewind/Forward Button"
2645
+ #~ msgstr ""
2646
+
2647
+ #~ msgid "Adds a button to go 10 seconds back/forth."
2648
+ #~ msgstr ""
2649
+
2650
+ #~ msgid "Maintenance tools and debug info."
2651
+ #~ msgstr ""
2652
+
2653
+ #~ msgid "Disable saving skin CSS to a static file"
2654
+ #~ msgstr ""
2655
+
2656
+ #~ msgid "Handle WordPress audio/video"
2657
+ #~ msgstr ""
2658
+
2659
+ #~ msgid "Optimize FV Flowplayer JS loading"
2660
+ #~ msgstr ""
2661
+
2662
+ #~ msgid "Helps with Google PageSpeed scores."
2663
+ #~ msgstr ""
2664
+
2665
+ #~ msgid "Alternative iOS fullscreen mode"
2666
+ #~ msgstr ""
2667
+
2668
+ #~ msgid "Force landscape orientation in fullscreen"
2669
+ #~ msgstr ""
2670
+
2671
+ #~ msgid "Works on the Android mobile, not supported on iOS unfortunately."
2672
+ #~ msgstr ""
2673
+
2674
+ #~ msgid " Adds the video meta data information for search engines."
2675
+ #~ msgstr ""
2676
+
2677
+ #~ msgid "Show on pause"
2678
+ #~ msgstr ""
2679
+
2680
+ #~ msgid "Playlist Item Titles"
2681
+ #~ msgstr ""
2682
+
2683
+ #~ msgid "Splash Text"
2684
+ #~ msgstr ""
2685
+
2686
+ #~ msgid "Sticky"
2687
+ #~ msgstr ""
2688
+
2689
+ #~ msgid "Synopsis"
2690
+ #~ msgstr ""
2691
+
2692
+ #~ msgid "Color"
2693
+ #~ msgstr ""
2694
+
2695
+ #~ msgid "Controlbar Fullscreen"
2696
+ #~ msgstr ""
2697
+
2698
+ #~ msgid "Enter value in em"
2699
+ #~ msgstr ""
2700
+
2701
+ #~ msgid "Buttons"
2702
+ #~ msgstr ""
2703
+
2704
+ #~ msgid "Slim"
2705
+ #~ msgstr ""
2706
+
2707
+ #~ msgid "Full"
2708
+ #~ msgstr ""
2709
+
2710
+ #~ msgid "Fat"
2711
+ #~ msgstr ""
2712
+
2713
+ #~ msgid "Minimal"
2714
+ #~ msgstr ""
2715
+
2716
+ #~ msgid "Icons"
2717
+ #~ msgstr ""
2718
+
2719
+ #~ msgid "Edgy"
2720
+ #~ msgstr ""
2721
+
2722
+ #~ msgid "Outlined"
2723
+ #~ msgstr ""
2724
+
2725
+ #~ msgid "Playful"
2726
+ #~ msgstr ""
2727
+
2728
+ #~ msgid "(inherit from player)"
2729
+ #~ msgstr ""
2730
+
2731
+ #~ msgid "Second line."
2732
+ #~ msgstr ""
2733
+
2734
+ #~ msgid "Enable"
2735
+ #~ msgstr ""
2736
+
2737
+ #~ msgid "Placement"
2738
+ #~ msgstr ""
2739
+
2740
+ #~ msgid "Player width [px]"
2741
+ #~ msgstr ""
2742
+
2743
+ #~ msgid "Basic Setup"
2744
+ #~ msgstr ""
2745
+
2746
+ #~ msgid "Installation"
2747
+ #~ msgstr ""
2748
+
2749
+ #~ msgid "Start up guide"
2750
+ #~ msgstr ""
2751
+
2752
+ #~ msgid "Alignment Settings"
2753
+ #~ msgstr ""
2754
+
2755
+ #~ msgid "Customizing FV Player Skin"
2756
+ #~ msgstr ""
2757
+
2758
+ #~ msgid "Sharing Videos on Social Media"
2759
+ #~ msgstr ""
2760
+
2761
+ #~ msgid "Email Sharing"
2762
+ #~ msgstr ""
2763
+
2764
+ #~ msgid "Using the Iframe Embedding"
2765
+ #~ msgstr ""
2766
+
2767
+ #~ msgid "Using the Video Lightbox Effect"
2768
+ #~ msgstr ""
2769
+
2770
+ #~ msgid "Video Encoding for HTML 5"
2771
+ #~ msgstr ""
2772
+
2773
+ #~ msgid "How to Create Playlists"
2774
+ #~ msgstr ""
2775
+
2776
+ #~ msgid "VTT Chapters"
2777
+ #~ msgstr ""
2778
+
2779
+ #~ msgid "Adding Titles and Splash Text"
2780
+ #~ msgstr ""
2781
+
2782
+ #~ msgid "Setting Up Video Quality Switching"
2783
+ #~ msgstr ""
2784
+
2785
+ #~ msgid "How to Use the Built-in Video Checker"
2786
+ #~ msgstr ""
2787
+
2788
+ #~ msgid "Creating Video Links in FV Player"
2789
+ #~ msgstr ""
2790
+
2791
+ #~ msgid "Switching FV Player Pro to Beta"
2792
+ #~ msgstr ""
2793
+
2794
+ #~ msgid "FAQ"
2795
+ #~ msgstr ""
2796
+
2797
+ #~ msgid "WordPress Video Plugins Comparison"
2798
+ #~ msgstr ""
2799
+
2800
+ #~ msgid "List of Shortcode Parameters"
2801
+ #~ msgstr ""
2802
+
2803
+ #~ msgid "Video Hosting"
2804
+ #~ msgstr ""
2805
+
2806
+ #~ msgid "Using YouTube with FV Player"
2807
+ #~ msgstr ""
2808
+
2809
+ #~ msgid "How to Use Vimeo with WordPress"
2810
+ #~ msgstr ""
2811
+
2812
+ #~ msgid "Serving Private Videos with Amazon S3"
2813
+ #~ msgstr ""
2814
+
2815
+ #~ msgid "Serving Private Videos via CloudFront"
2816
+ #~ msgstr ""
2817
+
2818
+ #~ msgid "Using BunnyCDN with FV Player Pro"
2819
+ #~ msgstr ""
2820
+
2821
+ #~ msgid "Using KeyCDN With FV Player"
2822
+ #~ msgstr ""
2823
+
2824
+ #~ msgid "Using HLS With FV Player"
2825
+ #~ msgstr ""
2826
+
2827
+ #~ msgid "Advertising Options with FV Player"
2828
+ #~ msgstr ""
2829
+
2830
+ #~ msgid "Custom Video Ads in FV Player (pre-roll and post-roll)"
2831
+ #~ msgstr ""
2832
+
2833
+ #~ msgid "Overlay Ads in FV Player"
2834
+ #~ msgstr ""
2835
+
2836
+ #~ msgid "Google Video Advertising Options"
2837
+ #~ msgstr ""
2838
+
2839
+ #~ msgid "Incorporating Google Ads (AdSense)"
2840
+ #~ msgstr ""
2841
+
2842
+ #~ msgid "Video Actions: HTML Pop-ups"
2843
+ #~ msgstr ""
2844
+
2845
+ #~ msgid "Using ExoClick Ads With FV Player"
2846
+ #~ msgstr ""
2847
+
2848
+ #~ msgid "Advanced"
2849
+ #~ msgstr ""
2850
+
2851
+ #~ msgid "How to use FV Player Widget"
2852
+ #~ msgstr ""
2853
+
2854
+ #~ msgid "Setting up Video Custom Fields"
2855
+ #~ msgstr ""
2856
+
2857
+ #~ msgid "Using Google Analytics with FV Player"
2858
+ #~ msgstr ""
2859
+
2860
+ #~ msgid "AB Loop Function"
2861
+ #~ msgstr ""
2862
+
2863
+ #~ msgid "How to Create Subtitles"
2864
+ #~ msgstr ""
2865
+
2866
+ #~ msgid "Interactive Video Transcript"
2867
+ #~ msgstr ""
2868
+
2869
+ #~ msgid "How to Use Custom Start/End Time"
2870
+ #~ msgstr ""
2871
+
2872
+ #~ msgid "Sticky Video"
2873
+ #~ msgstr ""
2874
+
2875
+ #~ msgid "CSS Tips and Fixes"
2876
+ #~ msgstr ""
2877
+
2878
+ #~ msgid "Using FV Player with Minify Plugins"
2879
+ #~ msgstr ""
2880
+
2881
+ #~ msgid "How to Use the Speed Buttons"
2882
+ #~ msgstr ""
2883
+
2884
+ #~ msgid "Using FV Player with Sub-domains and Multi-Domains"
2885
+ #~ msgstr ""
2886
+
2887
+ #~ msgid "FV Player Profile Videos"
2888
+ #~ msgstr ""
2889
+
2890
+ #~ msgid "Video Downloading With Simple History Support"
2891
+ #~ msgstr ""
2892
+
2893
+ #~ msgid "Email Subscription Form Pop-ups"
2894
+ #~ msgstr ""
2895
+
2896
+ #~ msgid "Using FV Player With AMP"
2897
+ #~ msgstr ""
2898
+
2899
+ #~ msgid "Programmer&#8217;s Guide"
2900
+ #~ msgstr ""
2901
+
2902
+ #~ msgid "FV WordPress Flowplayer Downgrading"
2903
+ #~ msgstr ""
2904
+
2905
+ #~ msgid "Changelog"
2906
+ #~ msgstr ""
2907
+
2908
+ #~ msgid "Incompatible Plugins and Scripts"
2909
+ #~ msgstr ""
2910
+
2911
+ #~ msgid "Securing Your Video"
2912
+ #~ msgstr ""
2913
+
2914
+ #~ msgid "How to Protect Your Videos from Being Downloaded"
2915
+ #~ msgstr ""
2916
+
2917
+ #~ msgid "How to use RTMP streams with Flash"
2918
+ #~ msgstr ""
2919
+
2920
+ #~ msgid "How to setup encrypted HLS stream with Amazon Elastic Transcoder"
2921
+ #~ msgstr ""
2922
+
2923
+ #~ msgid "Protecting Videos With DRM Text"
2924
+ #~ msgstr ""
2925
+
2926
+ #~ msgid "VAST/VPAID Ads"
2927
+ #~ msgstr ""
2928
+
2929
+ #~ msgid "How to Use FV Player VAST"
2930
+ #~ msgstr ""
2931
+
2932
+ #~ msgid "Using URL Tags"
2933
+ #~ msgstr ""
2934
+
2935
+ #~ msgid "VAST Tester"
2936
+ #~ msgstr ""
2937
+
2938
+ #~ msgid "Tracking VAST and VPAID Ads With Google Analytics"
2939
+ #~ msgstr ""
2940
+
2941
+ #~ msgid "Using FV Player VAST Outside WordPress"
2942
+ #~ msgstr ""
2943
+
2944
+ #~ msgid "List of Sample VAST/VPAID Ad Tags"
2945
+ #~ msgstr ""
2946
+
2947
+ #~ msgid "Remove all data"
2948
+ #~ msgstr ""
2949
+
2950
+ #~ msgid "Tools"
2951
+ #~ msgstr ""
2952
+
2953
+ #~ msgid "Video SEO"
2954
+ #~ msgstr ""
2955
+
2956
+ #~ msgid "Custom CSS"
2957
+ #~ msgstr ""
2958
+
2959
+ #~ msgid "Rollback"
2960
+ #~ msgstr ""
2961
+
2962
+ #~ msgid "Uninstall"
2963
+ #~ msgstr ""
2964
+
2965
+ #~ msgid "Check license"
2966
+ #~ msgstr ""
2967
+
2968
+ #~ msgid "Embeds"
2969
+ #~ msgstr ""
2970
+
2971
+ #~ msgid "FV Player Pro is required to use this video type in playlist."
2972
+ #~ msgstr ""
2973
+
2974
+ #~ msgid "Title"
2975
+ #~ msgstr ""
2976
+
2977
+ #~ msgid "DVR stream"
2978
+ #~ msgstr ""
2979
+
2980
+ #~ msgid "Audio stream"
2981
+ #~ msgstr ""
2982
+
2983
+ #~ msgid "Pick existing player"
2984
+ #~ msgstr ""
languages/fv-wordpress-flowplayer-sk_SK.mo CHANGED
Binary file
languages/fv-wordpress-flowplayer-sk_SK.po CHANGED
@@ -1,17 +1,18 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV Wordpress Flowplayer v2.3.13\n"
4
- "POT-Creation-Date: 2017-08-07 14:19+0200\n"
5
- "PO-Revision-Date: 2017-08-07 14:20+0200\n"
 
6
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
7
  "Language-Team: \n"
8
  "Language: sk_SK\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.11\n"
13
- "X-Poedit-Basepath: ..\n"
14
  "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
15
  "X-Poedit-KeywordsList: _e;_n;__\n"
16
  "X-Poedit-SearchPath-0: .\n"
17
  "X-Poedit-SearchPathExcluded-0: *.js\n"
@@ -2128,6 +2129,27 @@ msgstr ""
2128
  msgid "Ad Size"
2129
  msgstr ""
2130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2131
  #~ msgid "FV Flowplayer License Update"
2132
  #~ msgstr "Aktualizovať FV Flowplayer licenciu"
2133
 
@@ -2216,20 +2238,616 @@ msgstr ""
2216
  #~ "Poznámka pre admina: Upload videa je dočasne zakázaný, zaškrtnite "
2217
  #~ "'Povoliť upload uživateľovi' v "
2218
 
2219
- msgid "All"
2220
- msgstr "Všetko"
 
2221
 
2222
- msgid "Play All"
2223
- msgstr "Prehrať všetko"
2224
 
2225
- msgid "Replay Playlist"
2226
- msgstr "Opakuj playlist"
2227
 
2228
- msgid "Repeat Track"
2229
- msgstr "Opakuj video"
2230
 
2231
- msgid "Shuffle Playlist"
2232
- msgstr "Náhodný výber"
 
 
 
2233
 
2234
- msgid "Item %d."
2235
- msgstr "Video %d."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: FV Wordpress Flowplayer v2.3.13\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2021-10-21 10:26+0100\n"
6
+ "PO-Revision-Date: 2021-10-21 10:26+0100\n"
7
  "Last-Translator: Polak Maros <polak.maros@foliovision.com>\n"
8
  "Language-Team: \n"
9
  "Language: sk_SK\n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
 
 
13
  "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
14
+ "X-Generator: Eazy Po 0.9.5.3\n"
15
+ "X-Poedit-Basepath: ..\n"
16
  "X-Poedit-KeywordsList: _e;_n;__\n"
17
  "X-Poedit-SearchPath-0: .\n"
18
  "X-Poedit-SearchPathExcluded-0: *.js\n"
2129
  msgid "Ad Size"
2130
  msgstr ""
2131
 
2132
+ msgid "All"
2133
+ msgstr "Všetko"
2134
+
2135
+ msgid "Play All"
2136
+ msgstr "Prehrať všetko"
2137
+
2138
+ msgid "Replay Playlist"
2139
+ msgstr "Opakuj playlist"
2140
+
2141
+ msgid "Repeat Track"
2142
+ msgstr "Opakuj video"
2143
+
2144
+ msgid "Shuffle Playlist"
2145
+ msgstr "Náhodný výber"
2146
+
2147
+ msgid "Item %d."
2148
+ msgstr "Video %d."
2149
+
2150
+ msgid "Click to unmute"
2151
+ msgstr "Zapnúť zvuk"
2152
+
2153
  #~ msgid "FV Flowplayer License Update"
2154
  #~ msgstr "Aktualizovať FV Flowplayer licenciu"
2155
 
2238
  #~ "Poznámka pre admina: Upload videa je dočasne zakázaný, zaškrtnite "
2239
  #~ "'Povoliť upload uživateľovi' v "
2240
 
2241
+ #, php-format
2242
+ #~ msgid "FV Player: Please upgrade to FV Player Pro version %s or above!"
2243
+ #~ msgstr ""
2244
 
2245
+ #~ msgid "Embed feature not supported in editor preview"
2246
+ #~ msgstr ""
2247
 
2248
+ #~ msgid "Link feature not supported in editor preview"
2249
+ #~ msgstr ""
2250
 
2251
+ #~ msgid "Video loading has stalled, click to reload"
2252
+ #~ msgstr ""
2253
 
2254
+ #, php-format
2255
+ #~ msgid "%s day"
2256
+ #~ msgid_plural "%s days"
2257
+ #~ msgstr[0] ""
2258
+ #~ msgstr[1] ""
2259
 
2260
+ #, php-format
2261
+ #~ msgid "%s hour"
2262
+ #~ msgid_plural "%s hours"
2263
+ #~ msgstr[0] ""
2264
+ #~ msgstr[1] ""
2265
+
2266
+ #, php-format
2267
+ #~ msgid "%s min"
2268
+ #~ msgid_plural "%s mins"
2269
+ #~ msgstr[0] ""
2270
+ #~ msgstr[1] ""
2271
+
2272
+ #, php-format
2273
+ #~ msgid "%s second"
2274
+ #~ msgid_plural "%s seconds"
2275
+ #~ msgstr[0] ""
2276
+ #~ msgstr[1] ""
2277
+
2278
+ #, php-format
2279
+ #~ msgid "%1$s and %2$s"
2280
+ #~ msgstr ""
2281
+
2282
+ #~ msgid "FV Player 7.5"
2283
+ #~ msgstr ""
2284
+
2285
+ #~ msgid "Thanks for letting me know!"
2286
+ #~ msgstr ""
2287
+
2288
+ #~ msgid "FV Player Video Lightbox"
2289
+ #~ msgstr ""
2290
+
2291
+ #~ msgid "FV Player database storage is here!"
2292
+ #~ msgstr ""
2293
+
2294
+ #~ msgid "FV Player Video Sitemap coverage"
2295
+ #~ msgstr ""
2296
+
2297
+ #~ msgid "Go to setting"
2298
+ #~ msgstr ""
2299
+
2300
+ #~ msgid "FV Player 7"
2301
+ #~ msgstr ""
2302
+
2303
+ #~ msgid "Africa (Cape Town)"
2304
+ #~ msgstr ""
2305
+
2306
+ #~ msgid "Asia Pacific (Hong Kong)"
2307
+ #~ msgstr ""
2308
+
2309
+ #~ msgid "Asia Pacific (Osaka-Local)"
2310
+ #~ msgstr ""
2311
+
2312
+ #~ msgid "China (Beijing)"
2313
+ #~ msgstr ""
2314
+
2315
+ #~ msgid "China (Ningxia)"
2316
+ #~ msgstr ""
2317
+
2318
+ #~ msgid "Europe (Frankfurt)"
2319
+ #~ msgstr ""
2320
+
2321
+ #~ msgid "Europe (Ireland)"
2322
+ #~ msgstr ""
2323
+
2324
+ #~ msgid "Europe (London)"
2325
+ #~ msgstr ""
2326
+
2327
+ #~ msgid "Europe (Milan)"
2328
+ #~ msgstr ""
2329
+
2330
+ #~ msgid "Europe (Paris)"
2331
+ #~ msgstr ""
2332
+
2333
+ #~ msgid "Europe (Stockholm)"
2334
+ #~ msgstr ""
2335
+
2336
+ #~ msgid "Middle East (Bahrain)"
2337
+ #~ msgstr ""
2338
+
2339
+ #~ msgid "An unknown error occurred"
2340
+ #~ msgstr ""
2341
+
2342
+ #~ msgid " extension installed successfully!"
2343
+ #~ msgstr ""
2344
+
2345
+ #~ msgid " extension install failed - "
2346
+ #~ msgstr ""
2347
+
2348
+ #~ msgid " extension upgraded successfully!"
2349
+ #~ msgstr ""
2350
+
2351
+ #~ msgid "Domain"
2352
+ #~ msgstr ""
2353
+
2354
+ #~ msgid "You can enter multiple domains separated by <code>,</code>."
2355
+ #~ msgstr ""
2356
+
2357
+ #~ msgid "Secure Token"
2358
+ #~ msgstr ""
2359
+
2360
+ #~ msgid "Draft"
2361
+ #~ msgstr ""
2362
+
2363
+ #~ msgid "Remove fancyBox"
2364
+ #~ msgstr ""
2365
+
2366
+ #~ msgid "Your gallery items will link to image files directly to allow this."
2367
+ #~ msgstr ""
2368
+
2369
+ #~ msgid "Player Name"
2370
+ #~ msgstr ""
2371
+
2372
+ #~ msgid "Date"
2373
+ #~ msgstr ""
2374
+
2375
+ #~ msgid "Author"
2376
+ #~ msgstr ""
2377
+
2378
+ #~ msgid "Chapters"
2379
+ #~ msgstr ""
2380
+
2381
+ #~ msgid "Transcript"
2382
+ #~ msgstr ""
2383
+
2384
+ #~ msgid "Embedded on"
2385
+ #~ msgstr ""
2386
+
2387
+ #~ msgid "Plays"
2388
+ #~ msgstr ""
2389
+
2390
+ #~ msgid "Players per page"
2391
+ #~ msgstr ""
2392
+
2393
+ #~ msgid "no region"
2394
+ #~ msgstr ""
2395
+
2396
+ #~ msgid "Remember video position"
2397
+ #~ msgstr ""
2398
+
2399
+ #~ msgid "Video Stats"
2400
+ #~ msgstr ""
2401
+
2402
+ #~ msgid "Gives you a daily count of video plays."
2403
+ #~ msgstr ""
2404
+
2405
+ #~ msgid "System Info"
2406
+ #~ msgstr ""
2407
+
2408
+ #~ msgid "Install"
2409
+ #~ msgstr ""
2410
+
2411
+ #~ msgid "Reset"
2412
+ #~ msgstr ""
2413
+
2414
+ #~ msgid "Login"
2415
+ #~ msgstr ""
2416
+
2417
+ #~ msgid "Password"
2418
+ #~ msgstr ""
2419
+
2420
+ #~ msgid "Sign in"
2421
+ #~ msgstr ""
2422
+
2423
+ #~ msgid "Hide the vi Ads tab"
2424
+ #~ msgstr ""
2425
+
2426
+ #~ msgid "video intelligence"
2427
+ #~ msgstr ""
2428
+
2429
+ #~ msgid "Account"
2430
+ #~ msgstr ""
2431
+
2432
+ #~ msgid "Hide vi Ads"
2433
+ #~ msgstr ""
2434
+
2435
+ #~ msgid "Free video intelligence ads"
2436
+ #~ msgstr ""
2437
+
2438
+ #~ msgid "Show the vi Ads tab again"
2439
+ #~ msgstr ""
2440
+
2441
+ #~ msgid "vi Ads"
2442
+ #~ msgstr ""
2443
+
2444
+ #~ msgid "Use XML Video Sitemap"
2445
+ #~ msgstr ""
2446
+
2447
+ #~ msgid "Sitemap Post Meta"
2448
+ #~ msgstr ""
2449
+
2450
+ #~ msgid "Amazon S3 Browser"
2451
+ #~ msgstr ""
2452
+
2453
+ #~ msgid "Show Amazon S3 Browser in the \"Add Video\" dialog."
2454
+ #~ msgstr ""
2455
+
2456
+ #~ msgid "Controlbar Always Visible"
2457
+ #~ msgstr ""
2458
+
2459
+ #~ msgid "Enter values in pixels or 100%."
2460
+ #~ msgstr ""
2461
+
2462
+ #~ msgid "Enable Chromecast"
2463
+ #~ msgstr ""
2464
+
2465
+ #~ msgid "Adds support for Google Chromecast."
2466
+ #~ msgstr ""
2467
+
2468
+ #~ msgid "Force HD Streaming"
2469
+ #~ msgstr ""
2470
+
2471
+ #~ msgid "Use HD quality for HLS/MPEG-DASH even on slow connections."
2472
+ #~ msgstr ""
2473
+
2474
+ #~ msgid "Matomo/Piwik Tracking"
2475
+ #~ msgstr ""
2476
+
2477
+ #~ msgid "matomo.your-domain.com"
2478
+ #~ msgstr ""
2479
+
2480
+ #~ msgid "Site ID"
2481
+ #~ msgstr ""
2482
+
2483
+ #~ msgid "Multiple video playback"
2484
+ #~ msgstr ""
2485
+
2486
+ #~ msgid "No Picture Button"
2487
+ #~ msgstr ""
2488
+
2489
+ #~ msgid "Adds a button to turn the video picture on and off."
2490
+ #~ msgstr ""
2491
+
2492
+ #~ msgid "Slider"
2493
+ #~ msgstr ""
2494
+
2495
+ #~ msgid "Vertical Season"
2496
+ #~ msgstr ""
2497
+
2498
+ #~ msgid "Polaroid"
2499
+ #~ msgstr ""
2500
+
2501
+ #~ msgid "Text"
2502
+ #~ msgstr ""
2503
+
2504
+ #~ msgid "Repeat Button"
2505
+ #~ msgstr ""
2506
+
2507
+ #~ msgid "Adds a button to set playlist/track repeat and shuffle."
2508
+ #~ msgstr ""
2509
+
2510
+ #~ msgid "Rewind/Forward Button"
2511
+ #~ msgstr ""
2512
+
2513
+ #~ msgid "Adds a button to go 10 seconds back/forth."
2514
+ #~ msgstr ""
2515
+
2516
+ #~ msgid "Maintenance tools and debug info."
2517
+ #~ msgstr ""
2518
+
2519
+ #~ msgid "Disable saving skin CSS to a static file"
2520
+ #~ msgstr ""
2521
+
2522
+ #~ msgid "Handle WordPress audio/video"
2523
+ #~ msgstr ""
2524
+
2525
+ #~ msgid "Optimize FV Flowplayer JS loading"
2526
+ #~ msgstr ""
2527
+
2528
+ #~ msgid "Helps with Google PageSpeed scores."
2529
+ #~ msgstr ""
2530
+
2531
+ #~ msgid "Alternative iOS fullscreen mode"
2532
+ #~ msgstr ""
2533
+
2534
+ #~ msgid "Force landscape orientation in fullscreen"
2535
+ #~ msgstr ""
2536
+
2537
+ #~ msgid "Works on the Android mobile, not supported on iOS unfortunately."
2538
+ #~ msgstr ""
2539
+
2540
+ #~ msgid " Adds the video meta data information for search engines."
2541
+ #~ msgstr ""
2542
+
2543
+ #~ msgid "Show on pause"
2544
+ #~ msgstr ""
2545
+
2546
+ #~ msgid "Playlist Item Titles"
2547
+ #~ msgstr ""
2548
+
2549
+ #~ msgid "Splash Text"
2550
+ #~ msgstr ""
2551
+
2552
+ #~ msgid "Sticky"
2553
+ #~ msgstr ""
2554
+
2555
+ #~ msgid "Synopsis"
2556
+ #~ msgstr ""
2557
+
2558
+ #~ msgid "Color"
2559
+ #~ msgstr ""
2560
+
2561
+ #~ msgid "Controlbar Fullscreen"
2562
+ #~ msgstr ""
2563
+
2564
+ #~ msgid "Enter value in em"
2565
+ #~ msgstr ""
2566
+
2567
+ #~ msgid "Buttons"
2568
+ #~ msgstr ""
2569
+
2570
+ #~ msgid "Timeline"
2571
+ #~ msgstr ""
2572
+
2573
+ #~ msgid "Slim"
2574
+ #~ msgstr ""
2575
+
2576
+ #~ msgid "Full"
2577
+ #~ msgstr ""
2578
+
2579
+ #~ msgid "Fat"
2580
+ #~ msgstr ""
2581
+
2582
+ #~ msgid "Minimal"
2583
+ #~ msgstr ""
2584
+
2585
+ #~ msgid "Icons"
2586
+ #~ msgstr ""
2587
+
2588
+ #~ msgid "Edgy"
2589
+ #~ msgstr ""
2590
+
2591
+ #~ msgid "Outlined"
2592
+ #~ msgstr ""
2593
+
2594
+ #~ msgid "Playful"
2595
+ #~ msgstr ""
2596
+
2597
+ #~ msgid "(inherit from player)"
2598
+ #~ msgstr ""
2599
+
2600
+ #~ msgid "Second line."
2601
+ #~ msgstr ""
2602
+
2603
+ #~ msgid "Enable"
2604
+ #~ msgstr ""
2605
+
2606
+ #~ msgid "Placement"
2607
+ #~ msgstr ""
2608
+
2609
+ #~ msgid "Player width [px]"
2610
+ #~ msgstr ""
2611
+
2612
+ #~ msgid "Basic Setup"
2613
+ #~ msgstr ""
2614
+
2615
+ #~ msgid "Installation"
2616
+ #~ msgstr ""
2617
+
2618
+ #~ msgid "Start up guide"
2619
+ #~ msgstr ""
2620
+
2621
+ #~ msgid "Alignment Settings"
2622
+ #~ msgstr ""
2623
+
2624
+ #~ msgid "Customizing FV Player Skin"
2625
+ #~ msgstr ""
2626
+
2627
+ #~ msgid "Sharing Videos on Social Media"
2628
+ #~ msgstr ""
2629
+
2630
+ #~ msgid "Email Sharing"
2631
+ #~ msgstr ""
2632
+
2633
+ #~ msgid "Using the Iframe Embedding"
2634
+ #~ msgstr ""
2635
+
2636
+ #~ msgid "Using the Video Lightbox Effect"
2637
+ #~ msgstr ""
2638
+
2639
+ #~ msgid "Video Encoding for HTML 5"
2640
+ #~ msgstr ""
2641
+
2642
+ #~ msgid "How to Create Playlists"
2643
+ #~ msgstr ""
2644
+
2645
+ #~ msgid "VTT Chapters"
2646
+ #~ msgstr ""
2647
+
2648
+ #~ msgid "Adding Titles and Splash Text"
2649
+ #~ msgstr ""
2650
+
2651
+ #~ msgid "Setting Up Video Quality Switching"
2652
+ #~ msgstr ""
2653
+
2654
+ #~ msgid "How to Use the Built-in Video Checker"
2655
+ #~ msgstr ""
2656
+
2657
+ #~ msgid "Creating Video Links in FV Player"
2658
+ #~ msgstr ""
2659
+
2660
+ #~ msgid "Switching FV Player Pro to Beta"
2661
+ #~ msgstr ""
2662
+
2663
+ #~ msgid "FAQ"
2664
+ #~ msgstr ""
2665
+
2666
+ #~ msgid "WordPress Video Plugins Comparison"
2667
+ #~ msgstr ""
2668
+
2669
+ #~ msgid "List of Shortcode Parameters"
2670
+ #~ msgstr ""
2671
+
2672
+ #~ msgid "Video Hosting"
2673
+ #~ msgstr ""
2674
+
2675
+ #~ msgid "Using YouTube with FV Player"
2676
+ #~ msgstr ""
2677
+
2678
+ #~ msgid "How to Use Vimeo with WordPress"
2679
+ #~ msgstr ""
2680
+
2681
+ #~ msgid "Serving Private Videos with Amazon S3"
2682
+ #~ msgstr ""
2683
+
2684
+ #~ msgid "Serving Private Videos via CloudFront"
2685
+ #~ msgstr ""
2686
+
2687
+ #~ msgid "Using BunnyCDN with FV Player Pro"
2688
+ #~ msgstr ""
2689
+
2690
+ #~ msgid "Using KeyCDN With FV Player"
2691
+ #~ msgstr ""
2692
+
2693
+ #~ msgid "Using HLS With FV Player"
2694
+ #~ msgstr ""
2695
+
2696
+ #~ msgid "Advertising Options with FV Player"
2697
+ #~ msgstr ""
2698
+
2699
+ #~ msgid "Custom Video Ads in FV Player (pre-roll and post-roll)"
2700
+ #~ msgstr ""
2701
+
2702
+ #~ msgid "Overlay Ads in FV Player"
2703
+ #~ msgstr ""
2704
+
2705
+ #~ msgid "Google Video Advertising Options"
2706
+ #~ msgstr ""
2707
+
2708
+ #~ msgid "Incorporating Google Ads (AdSense)"
2709
+ #~ msgstr ""
2710
+
2711
+ #~ msgid "Video Actions: HTML Pop-ups"
2712
+ #~ msgstr ""
2713
+
2714
+ #~ msgid "Using ExoClick Ads With FV Player"
2715
+ #~ msgstr ""
2716
+
2717
+ #~ msgid "Advanced"
2718
+ #~ msgstr ""
2719
+
2720
+ #~ msgid "How to use FV Player Widget"
2721
+ #~ msgstr ""
2722
+
2723
+ #~ msgid "Setting up Video Custom Fields"
2724
+ #~ msgstr ""
2725
+
2726
+ #~ msgid "Using Google Analytics with FV Player"
2727
+ #~ msgstr ""
2728
+
2729
+ #~ msgid "AB Loop Function"
2730
+ #~ msgstr ""
2731
+
2732
+ #~ msgid "How to Create Subtitles"
2733
+ #~ msgstr ""
2734
+
2735
+ #~ msgid "Interactive Video Transcript"
2736
+ #~ msgstr ""
2737
+
2738
+ #~ msgid "How to Use Custom Start/End Time"
2739
+ #~ msgstr ""
2740
+
2741
+ #~ msgid "Sticky Video"
2742
+ #~ msgstr ""
2743
+
2744
+ #~ msgid "CSS Tips and Fixes"
2745
+ #~ msgstr ""
2746
+
2747
+ #~ msgid "Using FV Player with Minify Plugins"
2748
+ #~ msgstr ""
2749
+
2750
+ #~ msgid "How to Use the Speed Buttons"
2751
+ #~ msgstr ""
2752
+
2753
+ #~ msgid "Using FV Player with Sub-domains and Multi-Domains"
2754
+ #~ msgstr ""
2755
+
2756
+ #~ msgid "FV Player Profile Videos"
2757
+ #~ msgstr ""
2758
+
2759
+ #~ msgid "Video Downloading With Simple History Support"
2760
+ #~ msgstr ""
2761
+
2762
+ #~ msgid "Email Subscription Form Pop-ups"
2763
+ #~ msgstr ""
2764
+
2765
+ #~ msgid "Using FV Player With AMP"
2766
+ #~ msgstr ""
2767
+
2768
+ #~ msgid "Programmer&#8217;s Guide"
2769
+ #~ msgstr ""
2770
+
2771
+ #~ msgid "FV WordPress Flowplayer Downgrading"
2772
+ #~ msgstr ""
2773
+
2774
+ #~ msgid "Changelog"
2775
+ #~ msgstr ""
2776
+
2777
+ #~ msgid "Incompatible Plugins and Scripts"
2778
+ #~ msgstr ""
2779
+
2780
+ #~ msgid "Securing Your Video"
2781
+ #~ msgstr ""
2782
+
2783
+ #~ msgid "How to Protect Your Videos from Being Downloaded"
2784
+ #~ msgstr ""
2785
+
2786
+ #~ msgid "How to use RTMP streams with Flash"
2787
+ #~ msgstr ""
2788
+
2789
+ #~ msgid "How to setup encrypted HLS stream with Amazon Elastic Transcoder"
2790
+ #~ msgstr ""
2791
+
2792
+ #~ msgid "Protecting Videos With DRM Text"
2793
+ #~ msgstr ""
2794
+
2795
+ #~ msgid "VAST/VPAID Ads"
2796
+ #~ msgstr ""
2797
+
2798
+ #~ msgid "How to Use FV Player VAST"
2799
+ #~ msgstr ""
2800
+
2801
+ #~ msgid "Using URL Tags"
2802
+ #~ msgstr ""
2803
+
2804
+ #~ msgid "VAST Tester"
2805
+ #~ msgstr ""
2806
+
2807
+ #~ msgid "Tracking VAST and VPAID Ads With Google Analytics"
2808
+ #~ msgstr ""
2809
+
2810
+ #~ msgid "Using FV Player VAST Outside WordPress"
2811
+ #~ msgstr ""
2812
+
2813
+ #~ msgid "List of Sample VAST/VPAID Ad Tags"
2814
+ #~ msgstr ""
2815
+
2816
+ #~ msgid "Remove all data"
2817
+ #~ msgstr ""
2818
+
2819
+ #~ msgid "Tools"
2820
+ #~ msgstr ""
2821
+
2822
+ #~ msgid "Video SEO"
2823
+ #~ msgstr ""
2824
+
2825
+ #~ msgid "Custom CSS"
2826
+ #~ msgstr ""
2827
+
2828
+ #~ msgid "Rollback"
2829
+ #~ msgstr ""
2830
+
2831
+ #~ msgid "Uninstall"
2832
+ #~ msgstr ""
2833
+
2834
+ #~ msgid "Check license"
2835
+ #~ msgstr ""
2836
+
2837
+ #~ msgid "Embeds"
2838
+ #~ msgstr ""
2839
+
2840
+ #~ msgid "FV Player Pro is required to use this video type in playlist."
2841
+ #~ msgstr ""
2842
+
2843
+ #~ msgid "Title"
2844
+ #~ msgstr ""
2845
+
2846
+ #~ msgid "DVR stream"
2847
+ #~ msgstr ""
2848
+
2849
+ #~ msgid "Audio stream"
2850
+ #~ msgstr ""
2851
+
2852
+ #~ msgid "Pick existing player"
2853
+ #~ msgstr ""
languages/fv-wordpress-flowplayer.pot ADDED
@@ -0,0 +1,2806 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #: view/admin.php:1450 view/admin.php:1451
7
+ #, fuzzy
8
+ msgid ""
9
+ msgstr ""
10
+ "Project-Id-Version: PACKAGE VERSION\n"
11
+ "Report-Msgid-Bugs-To: \n"
12
+ "POT-Creation-Date: 2021-11-22 10:57+0100\n"
13
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
15
+ "Language-Team: LANGUAGE <LL@li.org>\n"
16
+ "Language: \n"
17
+ "MIME-Version: 1.0\n"
18
+ "Content-Type: text/plain; charset=CHARSET\n"
19
+ "Content-Transfer-Encoding: 8bit\n"
20
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
21
+
22
+ #: controller/backend.php:134
23
+ msgid ""
24
+ "We also recommend you to open any of your videos on your site and see if you "
25
+ "get a red warning message about JavaScript not working."
26
+ msgstr ""
27
+
28
+ #: controller/backend.php:149
29
+ msgid "FV Flowplayer script found: "
30
+ msgstr ""
31
+
32
+ #: controller/backend.php:164
33
+ msgid "jQuery library found: "
34
+ msgstr ""
35
+
36
+ #: controller/backend.php:360
37
+ msgid "License key acquired successfully. <a href=\"\">Reload</a>"
38
+ msgstr ""
39
+
40
+ #: controller/backend.php:631
41
+ #, php-format
42
+ msgid ""
43
+ "FV Player has found old shortcodes in the content of your posts. <a href="
44
+ "\"%1$s\">Run the conversion script.</a>"
45
+ msgstr ""
46
+
47
+ #: controller/backend.php:806
48
+ #, php-format
49
+ msgid "FV Player: Please upgrade to FV Player Pro version %s or above!"
50
+ msgstr ""
51
+
52
+ #: controller/backend.php:822
53
+ #, php-format
54
+ msgid ""
55
+ "FV Player: Please upgrade to FV Player Pay Per View version %s or above!"
56
+ msgstr ""
57
+
58
+ #: controller/backend.php:838
59
+ #, php-format
60
+ msgid ""
61
+ "FV Player: Please upgrade to FV Player Pay Per View for WooCommerce version "
62
+ "%s or above!"
63
+ msgstr ""
64
+
65
+ #: controller/editor.php:64
66
+ msgid "Embed feature not supported in editor preview"
67
+ msgstr ""
68
+
69
+ #: controller/editor.php:65
70
+ msgid "Link feature not supported in editor preview"
71
+ msgstr ""
72
+
73
+ #: controller/editor.php:66
74
+ msgid ""
75
+ "<div class=\"error\"><p>Cannot obtain video screenshot, please make sure the "
76
+ "video is served with <a href=\"https://foliovision.com/player/video-hosting/"
77
+ "hls#hls-js\">CORS headers</a>.</p></div>"
78
+ msgstr ""
79
+
80
+ #: controller/editor.php:101
81
+ msgid "Add FV Player"
82
+ msgstr ""
83
+
84
+ #: controller/editor.php:275
85
+ #, php-format
86
+ msgid ""
87
+ "Error retrieving a thumbnail from the URL <a href=\"%1$s\">%1$s</a> using "
88
+ "<code>wp_remote_get()</code><br />If opening that URL in your web browser "
89
+ "returns anything else than an error page, the problem may be related to your "
90
+ "web server and might be something your host administrator can solve."
91
+ msgstr ""
92
+
93
+ #: controller/editor.php:275
94
+ msgid "Error Details:"
95
+ msgstr ""
96
+
97
+ #: controller/editor.php:293
98
+ msgid "Unsupported MIME type:"
99
+ msgstr ""
100
+
101
+ #: controller/editor.php:304
102
+ msgid "Error uploading image data:"
103
+ msgstr ""
104
+
105
+ #: controller/frontend.php:44
106
+ msgid ""
107
+ " <a target=\"_blank\" href=\"https://foliovision.com/2017/05/issues-with-"
108
+ "vimeo-on-android\">Why?</a>"
109
+ msgstr ""
110
+
111
+ #: controller/frontend.php:48
112
+ msgid "Video loading aborted"
113
+ msgstr ""
114
+
115
+ #: controller/frontend.php:49
116
+ msgid "Network error"
117
+ msgstr ""
118
+
119
+ #: controller/frontend.php:50
120
+ msgid "Video not properly encoded"
121
+ msgstr ""
122
+
123
+ #: controller/frontend.php:51
124
+ msgid "Video file not found"
125
+ msgstr ""
126
+
127
+ #: controller/frontend.php:52
128
+ msgid "Unsupported video"
129
+ msgstr ""
130
+
131
+ #: controller/frontend.php:53
132
+ msgid "Skin not found"
133
+ msgstr ""
134
+
135
+ #: controller/frontend.php:54
136
+ msgid "SWF file not found"
137
+ msgstr ""
138
+
139
+ #: controller/frontend.php:55
140
+ msgid "Subtitles not found"
141
+ msgstr ""
142
+
143
+ #: controller/frontend.php:56
144
+ msgid "Invalid RTMP URL"
145
+ msgstr ""
146
+
147
+ #: controller/frontend.php:57
148
+ msgid "Unsupported video format. Try installing Adobe Flash."
149
+ msgstr ""
150
+
151
+ #: controller/frontend.php:58 models/flowplayer-frontend.php:360
152
+ #: models/flowplayer-frontend.php:379
153
+ msgid "Click to watch the video"
154
+ msgstr ""
155
+
156
+ #: controller/frontend.php:59 models/flowplayer-frontend.php:360
157
+ msgid "[This post contains video, click to play]"
158
+ msgstr ""
159
+
160
+ #: controller/frontend.php:60
161
+ msgid ""
162
+ "<h2>Video file expired.<br />Please reload the page and play it again.</h2>"
163
+ msgstr ""
164
+
165
+ #: controller/frontend.php:61
166
+ msgid ""
167
+ "<h2>Unsupported video format.<br />Please use a Flash compatible device.</h2>"
168
+ msgstr ""
169
+
170
+ #: controller/frontend.php:62
171
+ msgid "Mobile browser detected, serving low bandwidth video."
172
+ msgstr ""
173
+
174
+ #: controller/frontend.php:63
175
+ msgid "Click here for full quality"
176
+ msgstr ""
177
+
178
+ #: controller/frontend.php:64 controller/frontend.php:65
179
+ msgid ""
180
+ "<h2>Live stream load failed.</h2><h3>Please try again later, perhaps the "
181
+ "stream is currently offline.</h3>"
182
+ msgstr ""
183
+
184
+ #: controller/frontend.php:66
185
+ msgid "Please tell us what is wrong :"
186
+ msgstr ""
187
+
188
+ #: controller/frontend.php:67
189
+ msgid ""
190
+ "Please give us more information (a full sentence) so we can help you better"
191
+ msgstr ""
192
+
193
+ #: controller/frontend.php:68
194
+ msgid "Admin: Error parsing JSON"
195
+ msgstr ""
196
+
197
+ #: controller/frontend.php:69
198
+ msgid "Admin: Video checker doesn't support IE 9."
199
+ msgstr ""
200
+
201
+ #: controller/frontend.php:70
202
+ msgid "Admin: Check failed."
203
+ msgstr ""
204
+
205
+ #: controller/frontend.php:71
206
+ msgid "Now Playing"
207
+ msgstr ""
208
+
209
+ #: controller/frontend.php:72
210
+ #, php-format
211
+ msgid "Item %d."
212
+ msgstr ""
213
+
214
+ #: controller/frontend.php:73
215
+ msgid "Play All"
216
+ msgstr ""
217
+
218
+ #: controller/frontend.php:74
219
+ msgid "All"
220
+ msgstr ""
221
+
222
+ #: controller/frontend.php:75
223
+ msgid "Replay Playlist"
224
+ msgstr ""
225
+
226
+ #: controller/frontend.php:76
227
+ msgid "Repeat Track"
228
+ msgstr ""
229
+
230
+ #: controller/frontend.php:77
231
+ msgid "Shuffle Playlist"
232
+ msgstr ""
233
+
234
+ #: controller/frontend.php:78
235
+ msgid "Video Issues"
236
+ msgstr ""
237
+
238
+ #: controller/frontend.php:79
239
+ msgid "Video loading has stalled, click to reload"
240
+ msgstr ""
241
+
242
+ #: controller/frontend.php:80
243
+ msgid "Video Link Copied to Clipboard"
244
+ msgstr ""
245
+
246
+ #: controller/frontend.php:81
247
+ #, php-format
248
+ msgid "<h2>Live stream scheduled</h2><p>Starting in <span>%d</span>.</p>"
249
+ msgstr ""
250
+
251
+ #: controller/frontend.php:82
252
+ #, php-format
253
+ msgid ""
254
+ "<h2>We are sorry, currently no live stream available.</h2><p>Retrying in "
255
+ "<span>%d</span> ...</p>"
256
+ msgstr ""
257
+
258
+ #: controller/frontend.php:83
259
+ #, php-format
260
+ msgid ""
261
+ "<h2>It appears the stream went down.</h2><p>Retrying in <span>%d</span> ...</"
262
+ "p>"
263
+ msgstr ""
264
+
265
+ #: controller/frontend.php:84
266
+ msgid "Embed Code Copied to Clipboard"
267
+ msgstr ""
268
+
269
+ #: controller/frontend.php:85
270
+ msgid "Subtitles disabled"
271
+ msgstr ""
272
+
273
+ #: controller/frontend.php:86
274
+ msgid "Subtitles switched to "
275
+ msgstr ""
276
+
277
+ #: controller/frontend.php:87
278
+ msgid "This video has subtitles, that are not supported on your device."
279
+ msgstr ""
280
+
281
+ #: controller/frontend.php:88
282
+ msgid ""
283
+ "You are using an old Android device. If you experience issues with the video "
284
+ "please use <a href=\"https://play.google.com/store/apps/details?id=org."
285
+ "mozilla.firefox\">Firefox</a>."
286
+ msgstr ""
287
+
288
+ #: controller/frontend.php:89
289
+ msgid ""
290
+ "You are using the Samsung Browser which is an older and buggy version of "
291
+ "Google Chrome. If you experience issues with the video please use <a href="
292
+ "\"https://www.mozilla.org/en-US/firefox/new/\">Firefox</a> or other modern "
293
+ "browser."
294
+ msgstr ""
295
+
296
+ #: controller/frontend.php:90
297
+ msgid ""
298
+ "You are using an old Safari browser. If you experience issues with the video "
299
+ "please use <a href=\"https://www.mozilla.org/en-US/firefox/new/\">Firefox</"
300
+ "a> or other modern browser."
301
+ msgstr ""
302
+
303
+ #: controller/frontend.php:91
304
+ msgid ""
305
+ "You are using an old Chrome browser. Please make sure you use the latest "
306
+ "version."
307
+ msgstr ""
308
+
309
+ #: controller/frontend.php:92
310
+ msgid ""
311
+ "You are using an old Firefox browser. Please make sure you use the latest "
312
+ "version."
313
+ msgstr ""
314
+
315
+ #: controller/frontend.php:93
316
+ msgid ""
317
+ "You are using a deprecated browser. If you experience issues with the video "
318
+ "please use <a href=\"https://www.mozilla.org/en-US/firefox/new/\">Firefox</"
319
+ "a> or other modern browser."
320
+ msgstr ""
321
+
322
+ #: controller/frontend.php:94
323
+ msgid "Quality"
324
+ msgstr ""
325
+
326
+ #: controller/frontend.php:95
327
+ msgid "Closed Captions"
328
+ msgstr ""
329
+
330
+ #: controller/frontend.php:96
331
+ msgid "No subtitles"
332
+ msgstr ""
333
+
334
+ #: controller/frontend.php:97
335
+ msgid "Speed"
336
+ msgstr ""
337
+
338
+ #: controller/frontend.php:98 controller/frontend.php:99
339
+ #, php-format
340
+ msgid "%s day"
341
+ msgid_plural "%s days"
342
+ msgstr[0] ""
343
+ msgstr[1] ""
344
+
345
+ #: controller/frontend.php:100 controller/frontend.php:101
346
+ #, php-format
347
+ msgid "%s hour"
348
+ msgid_plural "%s hours"
349
+ msgstr[0] ""
350
+ msgstr[1] ""
351
+
352
+ #: controller/frontend.php:102 controller/frontend.php:103
353
+ #, php-format
354
+ msgid "%s min"
355
+ msgid_plural "%s mins"
356
+ msgstr[0] ""
357
+ msgstr[1] ""
358
+
359
+ #: controller/frontend.php:104 controller/frontend.php:105
360
+ #, php-format
361
+ msgid "%s second"
362
+ msgid_plural "%s seconds"
363
+ msgstr[0] ""
364
+ msgstr[1] ""
365
+
366
+ #: controller/frontend.php:106
367
+ #, php-format
368
+ msgid "%1$s and %2$s"
369
+ msgstr ""
370
+
371
+ #: controller/frontend.php:107
372
+ msgid ""
373
+ "It appears you are using the Disable HTML5 Autoplay Chrome extension, "
374
+ "disable it to play videos"
375
+ msgstr ""
376
+
377
+ #: controller/frontend.php:108
378
+ msgid "Click to unmute"
379
+ msgstr ""
380
+
381
+ #: controller/frontend.php:109
382
+ msgid "AUD"
383
+ msgstr ""
384
+
385
+ #: controller/frontend.php:110
386
+ msgid "Audio"
387
+ msgstr ""
388
+
389
+ #: controller/frontend.php:598
390
+ #, php-format
391
+ msgid "Posts by %s"
392
+ msgstr ""
393
+
394
+ #: controller/settings.php:143
395
+ msgid "FV Player Video Checker"
396
+ msgstr ""
397
+
398
+ #: controller/settings.php:144
399
+ msgid ""
400
+ "<p>FV Player includes a <a href='https://foliovision.com/player/basic-setup/"
401
+ "how-to-use-video-checker' target='_blank'>free video checker</a> which will "
402
+ "check your videos for any encoding errors and helps ensure smooth playback "
403
+ "of all your videos. To work its magic, our video checker must contact our "
404
+ "server.</p><p>Would you like to enable the video encoding checker?</p>"
405
+ msgstr ""
406
+
407
+ #: controller/settings.php:146
408
+ msgid "Allow"
409
+ msgstr ""
410
+
411
+ #: controller/settings.php:147
412
+ msgid "Disable the video checker"
413
+ msgstr ""
414
+
415
+ #: controller/settings.php:155
416
+ msgid "FV Player 7.5"
417
+ msgstr ""
418
+
419
+ #: controller/settings.php:156
420
+ msgid ""
421
+ "<p>This new version includes several improvements:</p>\n"
422
+ " <ul style='list-style-type: revert; margin-left: 3em'>\n"
423
+ " <li>Editor autosave and preview improvements</li>\n"
424
+ " <li>FV Player Video Play Stats</li>\n"
425
+ " <li>Improved player JavaScript loading</li>\n"
426
+ " <li>Multiple video playback improvements</li>\n"
427
+ " </ul>\n"
428
+ " <p>You can read more about it in our <a href='https://foliovision.com/?"
429
+ "p=137472' target='_blank'>blog announcement</a>.</p>"
430
+ msgstr ""
431
+
432
+ #: controller/settings.php:165 controller/settings.php:176
433
+ #: controller/settings.php:187 controller/settings.php:198
434
+ #: controller/settings.php:218
435
+ msgid "Thanks for letting me know!"
436
+ msgstr ""
437
+
438
+ #: controller/settings.php:173
439
+ msgid "FV Player Video Lightbox"
440
+ msgstr ""
441
+
442
+ #: controller/settings.php:174
443
+ msgid ""
444
+ "<p>The lightbox technology has been changed from <a href='http://www."
445
+ "jacklmoore.com/colorbox/' target='_blank'>Colorbox</a> to <a href='https://"
446
+ "fancyapps.com/fancybox/3/' target='_blank'>fancyBox</a></p><p>Please <a "
447
+ "href='https://foliovision.com/support/fv-wordpress-flowplayer/bug-"
448
+ "reports#new-post' target='_blank'>let us know</a> in case you notice any "
449
+ "issues. You can check <a href='https://foliovision.com/player/demos/fv-"
450
+ "flowplayer-lightbox' target='_blank'>our FV Player demo page</a> of it too.</"
451
+ "p>"
452
+ msgstr ""
453
+
454
+ #: controller/settings.php:184
455
+ msgid "FV Player database storage is here!"
456
+ msgstr ""
457
+
458
+ #: controller/settings.php:185
459
+ msgid ""
460
+ "<p>Any new or updated FV Player instances will be stored in database. This "
461
+ "simplifies the shortcodes and increases FV Player reliability. You can read "
462
+ "the full announcement <a href='https://foliovision.com/2018/11/video-"
463
+ "database/' target='_blank'>here</a></p><p>Please <a href='https://"
464
+ "foliovision.com/support/fv-wordpress-flowplayer/bug-reports#new-post' "
465
+ "target='_blank'>let us know</a> in case you notice any issues. Advanced "
466
+ "users can keep using the old shortcodes, but from now on the FV Player "
467
+ "editor works with database only.</p>"
468
+ msgstr ""
469
+
470
+ #: controller/settings.php:195
471
+ msgid "FV Player Video Sitemap coverage"
472
+ msgstr ""
473
+
474
+ #: controller/settings.php:196
475
+ msgid ""
476
+ "<p>The XML Video Sitemap now includes a lot more videos as it uses the "
477
+ "individual player iframe embed links. Until now it was only possible to put "
478
+ "in videos using MP4 format without any kind of download protection.</"
479
+ "p><p>Please <a href='https://foliovision.com/support/fv-wordpress-flowplayer/"
480
+ "bug-reports#new-post' target='_blank'>let us know</a> in case you notice any "
481
+ "issues. Your members only videos stay protected and won't open, but let us "
482
+ "know if they appear in sitemap.</p>"
483
+ msgstr ""
484
+
485
+ #: controller/settings.php:199
486
+ msgid "Go to setting"
487
+ msgstr ""
488
+
489
+ #: controller/settings.php:208
490
+ msgid "FV Player 7"
491
+ msgstr ""
492
+
493
+ #: controller/settings.php:230
494
+ msgid "FV Flowplayer License Expired"
495
+ msgstr ""
496
+
497
+ #: controller/settings.php:233
498
+ msgid "Hide this notice"
499
+ msgstr ""
500
+
501
+ #: controller/settings.php:234
502
+ msgid "I'll check this later"
503
+ msgstr ""
504
+
505
+ #: controller/settings.php:400
506
+ msgid "Africa (Cape Town)"
507
+ msgstr ""
508
+
509
+ #: controller/settings.php:401
510
+ msgid "Asia Pacific (Hong Kong)"
511
+ msgstr ""
512
+
513
+ #: controller/settings.php:402
514
+ msgid "Asia Pacific (Mumbai)"
515
+ msgstr ""
516
+
517
+ #: controller/settings.php:403
518
+ msgid "Asia Pacific (Osaka-Local)"
519
+ msgstr ""
520
+
521
+ #: controller/settings.php:404
522
+ msgid "Asia Pacific (Seoul)"
523
+ msgstr ""
524
+
525
+ #: controller/settings.php:405
526
+ msgid "Asia Pacific (Singapore)"
527
+ msgstr ""
528
+
529
+ #: controller/settings.php:406
530
+ msgid "Asia Pacific (Sydney)"
531
+ msgstr ""
532
+
533
+ #: controller/settings.php:407
534
+ msgid "Asia Pacific (Tokyo)"
535
+ msgstr ""
536
+
537
+ #: controller/settings.php:409
538
+ msgid "Canada (Central)"
539
+ msgstr ""
540
+
541
+ #: controller/settings.php:411
542
+ msgid "China (Beijing)"
543
+ msgstr ""
544
+
545
+ #: controller/settings.php:412
546
+ msgid "China (Ningxia)"
547
+ msgstr ""
548
+
549
+ #: controller/settings.php:414
550
+ msgid "Europe (Frankfurt)"
551
+ msgstr ""
552
+
553
+ #: controller/settings.php:415
554
+ msgid "Europe (Ireland)"
555
+ msgstr ""
556
+
557
+ #: controller/settings.php:416
558
+ msgid "Europe (London)"
559
+ msgstr ""
560
+
561
+ #: controller/settings.php:417
562
+ msgid "Europe (Milan)"
563
+ msgstr ""
564
+
565
+ #: controller/settings.php:418
566
+ msgid "Europe (Paris)"
567
+ msgstr ""
568
+
569
+ #: controller/settings.php:419
570
+ msgid "Europe (Stockholm)"
571
+ msgstr ""
572
+
573
+ #: controller/settings.php:421
574
+ msgid "Middle East (Bahrain)"
575
+ msgstr ""
576
+
577
+ #: controller/settings.php:423
578
+ msgid "South America (S&atilde;o Paulo)"
579
+ msgstr ""
580
+
581
+ #: controller/settings.php:425
582
+ msgid "US West (N. California)"
583
+ msgstr ""
584
+
585
+ #: controller/settings.php:426
586
+ msgid "US East (N. Virginia)"
587
+ msgstr ""
588
+
589
+ #: controller/settings.php:427
590
+ msgid "US East (Ohio)"
591
+ msgstr ""
592
+
593
+ #: controller/settings.php:428
594
+ msgid "US West (Oregon)"
595
+ msgstr ""
596
+
597
+ #: includes/fp-api-private.php:417
598
+ msgid ""
599
+ "An Unexpected HTTP Error occurred during the API request.</p> <p><a href=\"?"
600
+ "\" onclick=\"document.location.reload(); return false;\">Try again</a>"
601
+ msgstr ""
602
+
603
+ #: includes/fp-api-private.php:420
604
+ msgid "An unknown error occurred"
605
+ msgstr ""
606
+
607
+ #: includes/fp-api-private.php:882
608
+ msgid " extension installed successfully!"
609
+ msgstr ""
610
+
611
+ #: includes/fp-api-private.php:891 includes/fp-api-private.php:900
612
+ msgid " extension install failed - "
613
+ msgstr ""
614
+
615
+ #: includes/fp-api-private.php:906
616
+ msgid " extension upgraded successfully!"
617
+ msgstr ""
618
+
619
+ #: models/cdn.class.php:161
620
+ msgid "Domain"
621
+ msgstr ""
622
+
623
+ #: models/cdn.class.php:164
624
+ msgid "You can enter multiple domains separated by <code>,</code>."
625
+ msgstr ""
626
+
627
+ #: models/cdn.class.php:168
628
+ msgid "Secure Token"
629
+ msgstr ""
630
+
631
+ #: models/cdn.class.php:175 models/digitalocean-spaces.class.php:125
632
+ #: models/email-subscription.php:111 view/admin.php:75 view/admin.php:174
633
+ #: view/admin.php:372 view/admin.php:680 view/admin.php:698 view/admin.php:714
634
+ #: view/admin.php:765 view/admin.php:834 view/admin.php:889
635
+ #: view/admin.php:1111 view/admin.php:1456 view/admin.php:1484
636
+ #: view/admin.php:1525 view/admin.php:1565 view/admin.php:1699
637
+ msgid "Save All Changes"
638
+ msgstr ""
639
+
640
+ #: models/checker.php:366
641
+ msgid "Every 5 minutes"
642
+ msgstr ""
643
+
644
+ #: models/conversion.php:11
645
+ msgid "Conversion"
646
+ msgstr ""
647
+
648
+ #: models/conversion.php:17
649
+ msgid ""
650
+ "This section allows you to convert videos posted using other plugins to FV "
651
+ "Player shortcodes."
652
+ msgstr ""
653
+
654
+ #: models/conversion.php:21
655
+ msgid "Convert JW Player shortcodes"
656
+ msgstr ""
657
+
658
+ #: models/conversion.php:21
659
+ msgid ""
660
+ "This converts the [jwplayer] shortcodes into [fvplayer] shortcodes.\\n\\n "
661
+ "Please make sure you backup your database before continuing. You can use "
662
+ "revisions to get back to previos versions of your posts as well."
663
+ msgstr ""
664
+
665
+ #: models/custom-videos.php:262 models/custom-videos.php:292
666
+ #: models/custom-videos.php:402 models/list-table.php:70
667
+ msgid "Videos"
668
+ msgstr ""
669
+
670
+ #: models/custom-videos.php:408
671
+ msgid "You can put your Vimeo or YouTube links here."
672
+ msgstr ""
673
+
674
+ #: models/custom-videos.php:408
675
+ msgid ""
676
+ "These show up as a part of the user bio. Licensed users get FV Player Pro "
677
+ "which embeds these video types in FV Player interface without Vimeo or "
678
+ "YouTube interface showing up."
679
+ msgstr ""
680
+
681
+ #: models/custom-videos.php:427
682
+ msgid "Profile Videos"
683
+ msgstr ""
684
+
685
+ #: models/db-video.php:655
686
+ msgctxt "Comma-separated list of search stopwords in your language"
687
+ msgid ""
688
+ "about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,"
689
+ "was,what,when,where,who,will,with,www"
690
+ msgstr ""
691
+
692
+ #: models/db.php:382
693
+ msgid "Draft"
694
+ msgstr ""
695
+
696
+ #: models/email-subscription.php:56
697
+ msgid "Email Popups"
698
+ msgstr ""
699
+
700
+ #: models/email-subscription.php:57
701
+ msgid "Email Integration"
702
+ msgstr ""
703
+
704
+ #: models/email-subscription.php:97
705
+ msgid ""
706
+ "Enter your service API key and then assign it to a list which you create "
707
+ "above."
708
+ msgstr ""
709
+
710
+ #: models/email-subscription.php:101
711
+ msgid "Mailchimp API key"
712
+ msgstr ""
713
+
714
+ #: models/email-subscription.php:116
715
+ msgid "Please upgrade to PHP 5.3 or above to use the Mailchimp integration."
716
+ msgstr ""
717
+
718
+ #: models/email-subscription.php:132
719
+ msgid ""
720
+ "Lists defined here can be used for subscription box for each video or for "
721
+ "Default Popup above."
722
+ msgstr ""
723
+
724
+ #: models/email-subscription.php:140
725
+ msgid "Properties"
726
+ msgstr ""
727
+
728
+ #: models/email-subscription.php:142
729
+ msgid "Target List"
730
+ msgstr ""
731
+
732
+ #: models/email-subscription.php:144 models/system-info.php:222
733
+ msgid "Export"
734
+ msgstr ""
735
+
736
+ #: models/email-subscription.php:145 view/wizard.php:190
737
+ msgid "Options"
738
+ msgstr ""
739
+
740
+ #: models/email-subscription.php:146 view/admin.php:785
741
+ msgid "Status"
742
+ msgstr ""
743
+
744
+ #: models/email-subscription.php:204 models/email-subscription.php:640
745
+ msgid "Download CSV"
746
+ msgstr ""
747
+
748
+ #: models/email-subscription.php:206
749
+ msgid "View list"
750
+ msgstr ""
751
+
752
+ #: models/email-subscription.php:222 view/admin.php:823
753
+ msgid "Remove"
754
+ msgstr ""
755
+
756
+ #: models/email-subscription.php:237
757
+ msgid "Add More Lists"
758
+ msgstr ""
759
+
760
+ #: models/email-subscription.php:288
761
+ msgid "This is how the popup will appear at the end of a video"
762
+ msgstr ""
763
+
764
+ #: models/email-subscription.php:344
765
+ msgid "Email Address"
766
+ msgstr ""
767
+
768
+ #: models/email-subscription.php:345
769
+ msgid "Subscribe"
770
+ msgstr ""
771
+
772
+ #: models/email-subscription.php:433 models/email-subscription.php:499
773
+ msgid "Thank You for subscribing."
774
+ msgstr ""
775
+
776
+ #: models/email-subscription.php:442 models/email-subscription.php:533
777
+ msgid "Email Address already subscribed."
778
+ msgstr ""
779
+
780
+ #: models/email-subscription.php:448
781
+ msgid "Email Address not valid"
782
+ msgstr ""
783
+
784
+ #: models/email-subscription.php:510
785
+ msgid "Malformed Email Address."
786
+ msgstr ""
787
+
788
+ #: models/facebook-share.php:76
789
+ msgid ""
790
+ "When sharing your post to Facebook the first MP4 video will be shared "
791
+ "directly rather than the post excerpt."
792
+ msgstr ""
793
+
794
+ #: models/facebook-share.php:77
795
+ msgid ""
796
+ "<strong>Requirements</strong>: video has to be on https:// and splash screen "
797
+ "has to be present. Videos with download protection are automatically "
798
+ "excluded."
799
+ msgstr ""
800
+
801
+ #: models/flowplayer-frontend.php:379
802
+ msgid ""
803
+ "[This post contains advanced video player, click to open the original "
804
+ "website]"
805
+ msgstr ""
806
+
807
+ #: models/flowplayer.php:595 view/admin.php:332
808
+ msgid "Check out the amazing video here"
809
+ msgstr ""
810
+
811
+ #: models/flowplayer.php:2529 models/flowplayer.php:2539
812
+ msgid ""
813
+ "The preview is too narrow, vertical playlist will shift below the player as "
814
+ "it would on mobile."
815
+ msgstr ""
816
+
817
+ #: models/lightbox.php:515
818
+ msgid "Remove fancyBox"
819
+ msgstr ""
820
+
821
+ #: models/lightbox.php:515
822
+ msgid ""
823
+ "Use if FV Player lightbox is not working and you see a \"fancyBox already "
824
+ "initialized\" message on JavaScript console."
825
+ msgstr ""
826
+
827
+ #: models/lightbox.php:520 view/admin.php:938
828
+ msgid "Enable video lightbox"
829
+ msgstr ""
830
+
831
+ #: models/lightbox.php:520
832
+ msgid ""
833
+ "You can also put in <code>&lt;a href=\"http://path.to.your/video.mp4\" class="
834
+ "\"colorbox\"&gt;Your link title&lt;/a&gt;</code> for a quick lightboxed "
835
+ "video."
836
+ msgstr ""
837
+
838
+ #: models/lightbox.php:527
839
+ msgid "Use video lightbox for images as well"
840
+ msgstr ""
841
+
842
+ #: models/lightbox.php:532
843
+ msgid ""
844
+ "Will group images as well as videos into the same lightbox gallery. Turn "
845
+ "<strong>off</strong> your lightbox plugin when using this."
846
+ msgstr ""
847
+
848
+ #: models/lightbox.php:532
849
+ msgid ""
850
+ "Also works with WordPress <code>[gallery]</code> galleries - these are "
851
+ "automatically switched to link to image URLs rather than the attachment "
852
+ "pages."
853
+ msgstr ""
854
+
855
+ #: models/lightbox.php:537
856
+ msgid "Use video lightbox for WP Galleries"
857
+ msgstr ""
858
+
859
+ #: models/lightbox.php:542
860
+ msgid "Your gallery items will link to image files directly to allow this."
861
+ msgstr ""
862
+
863
+ #: models/list-table.php:66 models/widget.php:106
864
+ msgid "Player"
865
+ msgstr ""
866
+
867
+ #: models/list-table.php:67
868
+ msgid "Player Name"
869
+ msgstr ""
870
+
871
+ #: models/list-table.php:68
872
+ msgid "Date"
873
+ msgstr ""
874
+
875
+ #: models/list-table.php:69
876
+ msgid "Author"
877
+ msgstr ""
878
+
879
+ #: models/list-table.php:71 view/admin.php:1745 view/wizard.php:189
880
+ #: view/wizard.php:374
881
+ msgid "Subtitles"
882
+ msgstr ""
883
+
884
+ #: models/list-table.php:72
885
+ msgid "Chapters"
886
+ msgstr ""
887
+
888
+ #: models/list-table.php:73
889
+ msgid "Transcript"
890
+ msgstr ""
891
+
892
+ #: models/list-table.php:74 view/wizard.php:534
893
+ msgid "Embedded on"
894
+ msgstr ""
895
+
896
+ #: models/list-table.php:79
897
+ msgid "Plays"
898
+ msgstr ""
899
+
900
+ #: models/list-table.php:98
901
+ msgid "Players per page"
902
+ msgstr ""
903
+
904
+ #: models/media-browser-s3.php:261
905
+ msgid "no region"
906
+ msgstr ""
907
+
908
+ #: models/player-position-save.php:102
909
+ msgid "Remember video position"
910
+ msgstr ""
911
+
912
+ #: models/player-position-save.php:102
913
+ msgid ""
914
+ "Stores the last video play position for users, so they can continue watching "
915
+ "from where they left."
916
+ msgstr ""
917
+
918
+ #: models/player-position-save.php:102
919
+ msgid ""
920
+ "It stores in <code>wp_usermeta</code> database table for logged in users and "
921
+ "in a localStorage or cookie for guest users."
922
+ msgstr ""
923
+
924
+ #: models/stats.php:117
925
+ msgid "Video Stats"
926
+ msgstr ""
927
+
928
+ #: models/stats.php:117
929
+ msgid "Gives you a daily count of video plays."
930
+ msgstr ""
931
+
932
+ #: models/stats.php:117
933
+ msgid ""
934
+ "Uses a simple PHP script with a cron job to make sure these stats don't slow "
935
+ "down your server too much."
936
+ msgstr ""
937
+
938
+ #: models/system-info.php:11
939
+ msgid "System Info"
940
+ msgstr ""
941
+
942
+ #: models/video-intelligence.php:35
943
+ msgid "Install"
944
+ msgstr ""
945
+
946
+ #: models/video-intelligence.php:36
947
+ msgid "Reset"
948
+ msgstr ""
949
+
950
+ #: models/video-intelligence.php:42
951
+ msgid "Login"
952
+ msgstr ""
953
+
954
+ #: models/video-intelligence.php:50
955
+ msgid "Password"
956
+ msgstr ""
957
+
958
+ #: models/video-intelligence.php:61
959
+ msgid "Sign in"
960
+ msgstr ""
961
+
962
+ #: models/video-intelligence.php:132
963
+ msgid "Hide the vi Ads tab"
964
+ msgstr ""
965
+
966
+ #: models/video-intelligence.php:156
967
+ msgid "video intelligence"
968
+ msgstr ""
969
+
970
+ #: models/video-intelligence.php:157
971
+ msgid "Account"
972
+ msgstr ""
973
+
974
+ #: models/video-intelligence.php:158
975
+ msgid "Hide vi Ads"
976
+ msgstr ""
977
+
978
+ #: models/video-intelligence.php:160 models/video-intelligence.php:162
979
+ msgid "Free video intelligence ads"
980
+ msgstr ""
981
+
982
+ #: models/video-intelligence.php:179
983
+ msgid "Show the vi Ads tab again"
984
+ msgstr ""
985
+
986
+ #: models/video-intelligence.php:198
987
+ msgid "vi Ads"
988
+ msgstr ""
989
+
990
+ #: models/widget.php:11
991
+ msgid "FV Player widget."
992
+ msgstr ""
993
+
994
+ #: models/widget.php:13
995
+ msgid "FV Player"
996
+ msgstr ""
997
+
998
+ #: models/widget.php:98
999
+ msgid "Title:"
1000
+ msgstr ""
1001
+
1002
+ #: models/widget.php:107
1003
+ msgid "Edit"
1004
+ msgstr ""
1005
+
1006
+ #: models/xml-video-sitemap.php:467
1007
+ msgid "Use XML Video Sitemap"
1008
+ msgstr ""
1009
+
1010
+ #: models/xml-video-sitemap.php:467
1011
+ #, php-format
1012
+ msgid ""
1013
+ "Creates <code>%s</code> which you can submit via Google Webmaster Tools."
1014
+ msgstr ""
1015
+
1016
+ #: models/xml-video-sitemap.php:467
1017
+ msgid ""
1018
+ "As feeds tend to be cached by web browser make sure you clear your browser "
1019
+ "cache if you are doing some testing."
1020
+ msgstr ""
1021
+
1022
+ #: models/xml-video-sitemap.php:476
1023
+ msgid "Sitemap Post Meta"
1024
+ msgstr ""
1025
+
1026
+ #: models/xml-video-sitemap.php:476
1027
+ msgid ""
1028
+ "You can enter post meta keys here, use <code>,</code> to separate multiple "
1029
+ "values."
1030
+ msgstr ""
1031
+
1032
+ #: view/admin.php:33
1033
+ msgid "Default Ad Code"
1034
+ msgstr ""
1035
+
1036
+ #: view/admin.php:38
1037
+ msgid "Default set size"
1038
+ msgstr ""
1039
+
1040
+ #: view/admin.php:41
1041
+ msgid "Ad text"
1042
+ msgstr ""
1043
+
1044
+ #: view/admin.php:42
1045
+ msgid "Ad links"
1046
+ msgstr ""
1047
+
1048
+ #: view/admin.php:47
1049
+ msgid "Show After"
1050
+ msgstr ""
1051
+
1052
+ #: view/admin.php:52
1053
+ msgid "Ad CSS"
1054
+ msgstr ""
1055
+
1056
+ #: view/admin.php:53
1057
+ msgid "Show styling options"
1058
+ msgstr ""
1059
+
1060
+ #: view/admin.php:56
1061
+ msgid "Select your preset"
1062
+ msgstr ""
1063
+
1064
+ #: view/admin.php:57
1065
+ msgid "Default (white, centered above the control bar)"
1066
+ msgstr ""
1067
+
1068
+ #: view/admin.php:58
1069
+ msgid "White, centered at the bottom of the video"
1070
+ msgstr ""
1071
+
1072
+ #: view/admin.php:62
1073
+ msgid "(Hint: put .wpfp_custom_ad_content before your own CSS selectors)"
1074
+ msgstr ""
1075
+
1076
+ #: view/admin.php:109
1077
+ msgid ""
1078
+ "Secured Amazon S3 URLs are recommended for member-only sections of the site. "
1079
+ "We check the video length and make sure the link expiration time is big "
1080
+ "enough for the video to buffer properly."
1081
+ msgstr ""
1082
+
1083
+ #: view/admin.php:110
1084
+ msgid ""
1085
+ "If you use a cache plugin (such as Hyper Cache, WP Super Cache or W3 Total "
1086
+ "Cache), we recommend that you set the \"Default Expiration Time\" to twice "
1087
+ "as much as your cache timeout and check \"Force the default expiration time"
1088
+ "\". That way the video length won't be accounted and the video source URLs "
1089
+ "in your cached pages won't expire. Read more in the"
1090
+ msgstr ""
1091
+
1092
+ #: view/admin.php:110
1093
+ msgid "Using Amazon S3 secure content in FV Flowplayer guide"
1094
+ msgstr ""
1095
+
1096
+ #: view/admin.php:114
1097
+ msgid "Default Expiration Time [minutes]"
1098
+ msgstr ""
1099
+
1100
+ #: view/admin.php:114
1101
+ msgid ""
1102
+ "Each video duration is stored on post save and then used as the expire time. "
1103
+ "If the duration is not available, this value is used."
1104
+ msgstr ""
1105
+
1106
+ #: view/admin.php:120
1107
+ msgid "Force the default expiration time"
1108
+ msgstr ""
1109
+
1110
+ #: view/admin.php:121
1111
+ msgid "Amazon S3 Browser"
1112
+ msgstr ""
1113
+
1114
+ #: view/admin.php:121
1115
+ msgid "Show Amazon S3 Browser in the \"Add Video\" dialog."
1116
+ msgstr ""
1117
+
1118
+ #: view/admin.php:132
1119
+ msgid "Amazon Bucket"
1120
+ msgstr ""
1121
+
1122
+ #: view/admin.php:132
1123
+ msgid ""
1124
+ "We recommend that you simply put all of your protected video into a single "
1125
+ "bucket and enter its name here. All matching videos will use the protected "
1126
+ "URLs."
1127
+ msgstr ""
1128
+
1129
+ #: view/admin.php:136
1130
+ msgid "Region"
1131
+ msgstr ""
1132
+
1133
+ #: view/admin.php:139
1134
+ msgid "Select the region"
1135
+ msgstr ""
1136
+
1137
+ #: view/admin.php:152
1138
+ msgid "Access Key ID"
1139
+ msgstr ""
1140
+
1141
+ #: view/admin.php:156
1142
+ msgid "Secret Access Key"
1143
+ msgstr ""
1144
+
1145
+ #: view/admin.php:162
1146
+ msgid "remove"
1147
+ msgstr ""
1148
+
1149
+ #: view/admin.php:175
1150
+ msgid "Add more Amazon S3 secure buckets"
1151
+ msgstr ""
1152
+
1153
+ #: view/admin.php:191 view/admin.php:871 view/admin.php:1586
1154
+ msgid "Autoplay"
1155
+ msgstr ""
1156
+
1157
+ #: view/admin.php:203
1158
+ msgid ""
1159
+ "We make sure only one video per page autoplays. Mobile devices only support "
1160
+ "Muted autoplay."
1161
+ msgstr ""
1162
+
1163
+ #: view/admin.php:208
1164
+ msgid "Auto Buffering"
1165
+ msgstr ""
1166
+
1167
+ #: view/admin.php:208
1168
+ msgid "Works for first 2 videos on the page only, to preserve your bandwidth."
1169
+ msgstr ""
1170
+
1171
+ #: view/admin.php:209
1172
+ msgid "Controlbar Always Visible"
1173
+ msgstr ""
1174
+
1175
+ #: view/admin.php:211
1176
+ msgid "Default Video Size"
1177
+ msgstr ""
1178
+
1179
+ #: view/admin.php:214 view/wizard.php:289 view/wizard.php:419
1180
+ #: view/wizard.php:517
1181
+ msgid "Width"
1182
+ msgstr ""
1183
+
1184
+ #: view/admin.php:215 view/wizard.php:290 view/wizard.php:420
1185
+ #: view/wizard.php:518
1186
+ msgid "Height"
1187
+ msgstr ""
1188
+
1189
+ #: view/admin.php:216
1190
+ msgid "Enter values in pixels or 100%."
1191
+ msgstr ""
1192
+
1193
+ #: view/admin.php:221
1194
+ msgid "Default Volume"
1195
+ msgstr ""
1196
+
1197
+ #: view/admin.php:229
1198
+ msgid "Disable Admin Video Checker"
1199
+ msgstr ""
1200
+
1201
+ #: view/admin.php:229
1202
+ msgid ""
1203
+ "Checks your video encoding when you open a post with video as admin. "
1204
+ "Notifies you about possible playback issues."
1205
+ msgstr ""
1206
+
1207
+ #: view/admin.php:230
1208
+ msgid "Disable Embed Button"
1209
+ msgstr ""
1210
+
1211
+ #: view/admin.php:230
1212
+ msgid "Removes embed button from top bar."
1213
+ msgstr ""
1214
+
1215
+ #: view/admin.php:231
1216
+ msgid "Disable Playlist Autoadvance"
1217
+ msgstr ""
1218
+
1219
+ #: view/admin.php:231
1220
+ msgid "Playlist won't play the next video automatically."
1221
+ msgstr ""
1222
+
1223
+ #: view/admin.php:232
1224
+ msgid "Disable Sharing"
1225
+ msgstr ""
1226
+
1227
+ #: view/admin.php:232
1228
+ msgid "Removes sharing buttons from top bar."
1229
+ msgstr ""
1230
+
1231
+ #: view/admin.php:233
1232
+ msgid "Disable Video Links"
1233
+ msgstr ""
1234
+
1235
+ #: view/admin.php:233
1236
+ msgid "Removes the \"Link\" item to the top bar."
1237
+ msgstr ""
1238
+
1239
+ #: view/admin.php:233
1240
+ msgid ""
1241
+ "Clicking the video Link gives your visitors a link to the exact place in the "
1242
+ "video they are watching. If the post access is restricted, it won't make the "
1243
+ "video open to public."
1244
+ msgstr ""
1245
+
1246
+ #: view/admin.php:234
1247
+ msgid "Enable Chromecast"
1248
+ msgstr ""
1249
+
1250
+ #: view/admin.php:234
1251
+ msgid "Adds support for Google Chromecast."
1252
+ msgstr ""
1253
+
1254
+ #: view/admin.php:236
1255
+ msgid "Flash Streaming Server"
1256
+ msgstr ""
1257
+
1258
+ #: view/admin.php:239
1259
+ msgid "Enter your default RTMP streaming server (Amazon CloudFront domain)."
1260
+ msgstr ""
1261
+
1262
+ #: view/admin.php:244
1263
+ msgid "Force HD Streaming"
1264
+ msgstr ""
1265
+
1266
+ #: view/admin.php:244
1267
+ msgid "Use HD quality for HLS/MPEG-DASH even on slow connections."
1268
+ msgstr ""
1269
+
1270
+ #: view/admin.php:244
1271
+ msgid ""
1272
+ "User can still switch to lower quality by hand. Doesn't work on iPhones."
1273
+ msgstr ""
1274
+
1275
+ #: view/admin.php:246
1276
+ msgid "Fullscreen Button"
1277
+ msgstr ""
1278
+
1279
+ #: view/admin.php:246
1280
+ msgid "Adds fullscreen button to player top bar."
1281
+ msgstr ""
1282
+
1283
+ #: view/admin.php:249
1284
+ msgid "Google Analytics ID"
1285
+ msgstr ""
1286
+
1287
+ #: view/admin.php:252
1288
+ msgid "Will be automatically loaded when playing a video."
1289
+ msgstr ""
1290
+
1291
+ #: view/admin.php:265
1292
+ msgid "You have a valid FV Flowplayer license, you can put up your logo here"
1293
+ msgstr ""
1294
+
1295
+ #: view/admin.php:267
1296
+ msgid "You need to have a FV Flowplayer license to use it"
1297
+ msgstr ""
1298
+
1299
+ #: view/admin.php:271 view/admin.php:359
1300
+ msgid "Upload Image"
1301
+ msgstr ""
1302
+
1303
+ #: view/admin.php:277
1304
+ msgid "Position"
1305
+ msgstr ""
1306
+
1307
+ #: view/admin.php:278
1308
+ msgid "Bottom-left"
1309
+ msgstr ""
1310
+
1311
+ #: view/admin.php:279
1312
+ msgid "Bottom-right"
1313
+ msgstr ""
1314
+
1315
+ #: view/admin.php:280
1316
+ msgid "Top-left"
1317
+ msgstr ""
1318
+
1319
+ #: view/admin.php:281
1320
+ msgid "Top-right"
1321
+ msgstr ""
1322
+
1323
+ #: view/admin.php:287
1324
+ msgid "Matomo/Piwik Tracking"
1325
+ msgstr ""
1326
+
1327
+ #: view/admin.php:290
1328
+ msgid "matomo.your-domain.com"
1329
+ msgstr ""
1330
+
1331
+ #: view/admin.php:291
1332
+ msgid "Site ID"
1333
+ msgstr ""
1334
+
1335
+ #: view/admin.php:296
1336
+ msgid "Multiple video playback"
1337
+ msgstr ""
1338
+
1339
+ #: view/admin.php:296
1340
+ msgid ""
1341
+ "Allows multiple players to play at once. Only one player remains audible."
1342
+ msgstr ""
1343
+
1344
+ #: view/admin.php:298
1345
+ msgid "No Picture Button"
1346
+ msgstr ""
1347
+
1348
+ #: view/admin.php:298
1349
+ msgid "Adds a button to turn the video picture on and off."
1350
+ msgstr ""
1351
+
1352
+ #: view/admin.php:301
1353
+ msgid "Playlist style"
1354
+ msgstr ""
1355
+
1356
+ #: view/admin.php:308
1357
+ msgid "Horizontal"
1358
+ msgstr ""
1359
+
1360
+ #: view/admin.php:309
1361
+ msgid "Tabs"
1362
+ msgstr ""
1363
+
1364
+ #: view/admin.php:310
1365
+ msgid "Prev/Next"
1366
+ msgstr ""
1367
+
1368
+ #: view/admin.php:311
1369
+ msgid "Vertical"
1370
+ msgstr ""
1371
+
1372
+ #: view/admin.php:312
1373
+ msgid "Slider"
1374
+ msgstr ""
1375
+
1376
+ #: view/admin.php:313
1377
+ msgid "Vertical Season"
1378
+ msgstr ""
1379
+
1380
+ #: view/admin.php:314
1381
+ msgid "Polaroid"
1382
+ msgstr ""
1383
+
1384
+ #: view/admin.php:315
1385
+ msgid "Text"
1386
+ msgstr ""
1387
+
1388
+ #: view/admin.php:317
1389
+ msgid "Enter your default playlist style here"
1390
+ msgstr ""
1391
+
1392
+ #: view/admin.php:322
1393
+ msgid "Popup Box"
1394
+ msgstr ""
1395
+
1396
+ #: view/admin.php:322
1397
+ msgid ""
1398
+ "Shows a generic \"Would you like to replay the video?\" message at the end "
1399
+ "of each video."
1400
+ msgstr ""
1401
+
1402
+ #: view/admin.php:324
1403
+ msgid "Repeat Button"
1404
+ msgstr ""
1405
+
1406
+ #: view/admin.php:324
1407
+ msgid "Adds a button to set playlist/track repeat and shuffle."
1408
+ msgstr ""
1409
+
1410
+ #: view/admin.php:326
1411
+ msgid "Rewind/Forward Button"
1412
+ msgstr ""
1413
+
1414
+ #: view/admin.php:326
1415
+ msgid "Adds a button to go 10 seconds back/forth."
1416
+ msgstr ""
1417
+
1418
+ #: view/admin.php:329
1419
+ msgid "Sharing Text"
1420
+ msgstr ""
1421
+
1422
+ #: view/admin.php:337 view/admin.php:879
1423
+ msgid "Speed Buttons"
1424
+ msgstr ""
1425
+
1426
+ #: view/admin.php:337
1427
+ msgid ""
1428
+ "Speed buttons control playback speed and only work in HTML5 compatible "
1429
+ "browsers."
1430
+ msgstr ""
1431
+
1432
+ #: view/admin.php:340
1433
+ msgid "Speed Step"
1434
+ msgstr ""
1435
+
1436
+ #: view/admin.php:351
1437
+ msgid ""
1438
+ "Speed buttons will increase or decrease the speed in steps of selected value"
1439
+ msgstr ""
1440
+
1441
+ #: view/admin.php:356 view/wizard.php:318
1442
+ msgid "Splash Image"
1443
+ msgstr ""
1444
+
1445
+ #: view/admin.php:358
1446
+ msgid "Default which will be used for any player without its own splash image."
1447
+ msgstr ""
1448
+
1449
+ #: view/admin.php:362
1450
+ msgid "Subtitles On By Default"
1451
+ msgstr ""
1452
+
1453
+ #: view/admin.php:362
1454
+ msgid "Normally you have to hit a button in controlbar to turn on subtitles."
1455
+ msgstr ""
1456
+
1457
+ #: view/admin.php:367
1458
+ msgid ""
1459
+ "Missing settings? Check <a class=\"fv-settings-anchor\" href="
1460
+ "\"#fv_flowplayer_integrations\">Integrations/Compatbility</a> box below."
1461
+ msgstr ""
1462
+
1463
+ #: view/admin.php:479
1464
+ msgid "FV Player is a free, easy-to-use, and complete solution for embedding"
1465
+ msgstr ""
1466
+
1467
+ #: view/admin.php:481
1468
+ msgid "and"
1469
+ msgstr ""
1470
+
1471
+ #: view/admin.php:483
1472
+ msgid ""
1473
+ "videos into your posts or pages. With MP4 videos, FV Player offers 98&#37; "
1474
+ "coverage even on mobile devices."
1475
+ msgstr ""
1476
+
1477
+ #: view/admin.php:500
1478
+ msgid "You can customize the colors of the player to match your website."
1479
+ msgstr ""
1480
+
1481
+ #: view/admin.php:517
1482
+ msgid "Here you can enable and configure advanced hosting options."
1483
+ msgstr ""
1484
+
1485
+ #: view/admin.php:534
1486
+ msgid "Here you can configure ads and banners that will be shown in the video."
1487
+ msgstr ""
1488
+
1489
+ #: view/admin.php:551
1490
+ msgid "Maintenance tools and debug info."
1491
+ msgstr ""
1492
+
1493
+ #: view/admin.php:571
1494
+ msgid ""
1495
+ "Purchase <a href=\"https://foliovision.com/player/download\" target=\"_blank"
1496
+ "\"><b>FV Player Licence</b></a>, and you will be able to configure multiple, "
1497
+ "clickable Video Ads, that can be played before or after Your videos."
1498
+ msgstr ""
1499
+
1500
+ #: view/admin.php:574
1501
+ msgid "You can configure video ads globally, or on a per video basis."
1502
+ msgstr ""
1503
+
1504
+ #: view/admin.php:577
1505
+ msgid ""
1506
+ "If you are interested in VAST or VPAID ads, then check out <a href=\"https://"
1507
+ "foliovision.com/player/vast\" target=\"_blank\"><b>FV Player VAST</b></a>."
1508
+ msgstr ""
1509
+
1510
+ #: view/admin.php:588
1511
+ msgid "Following options are suitable for web developers and programmers."
1512
+ msgstr ""
1513
+
1514
+ #: view/admin.php:591
1515
+ msgid "Add featured image automatically"
1516
+ msgstr ""
1517
+
1518
+ #: view/admin.php:591
1519
+ msgid ""
1520
+ "If the featured image is not set, splash image of the first player will be "
1521
+ "used."
1522
+ msgstr ""
1523
+
1524
+ #: view/admin.php:592
1525
+ msgid "Always use fixed size player"
1526
+ msgstr ""
1527
+
1528
+ #: view/admin.php:592
1529
+ msgid "Enable to force video size at cost of loosing the video responsiveness."
1530
+ msgstr ""
1531
+
1532
+ #: view/admin.php:593
1533
+ msgid "Disable saving skin CSS to a static file"
1534
+ msgstr ""
1535
+
1536
+ #: view/admin.php:593
1537
+ msgid ""
1538
+ "Normally the player CSS configuration is stored in wp-content/fv-player-"
1539
+ "custom/style-{blog_id}.css."
1540
+ msgstr ""
1541
+
1542
+ #: view/admin.php:593
1543
+ msgid ""
1544
+ "We do this to avoid a big style tag in your site &lt;head&gt;. Don't edit "
1545
+ "this file though, as it will be overwritten by plugin update or saving its "
1546
+ "options!"
1547
+ msgstr ""
1548
+
1549
+ #: view/admin.php:596
1550
+ msgid "Enable profile videos"
1551
+ msgstr ""
1552
+
1553
+ #: view/admin.php:601
1554
+ msgid ""
1555
+ "Check your site carefully after enabling. Videos attached to the user "
1556
+ "profile will be showing as a part of the user bio."
1557
+ msgstr ""
1558
+
1559
+ #: view/admin.php:603
1560
+ msgid ""
1561
+ "This feature is designed for YouTube and Vimeo videos and works best for our "
1562
+ "licensed users who get these videos playing without YouTube or Vimeo "
1563
+ "branding."
1564
+ msgstr ""
1565
+
1566
+ #: view/admin.php:604
1567
+ msgid ""
1568
+ "Some themes show author bio on the author post archive automatically "
1569
+ "(Genesis framework and others). Or you can also just put this code into your "
1570
+ "theme archive.php template, right before <code>while ( have_posts() )</code> "
1571
+ "is called:"
1572
+ msgstr ""
1573
+
1574
+ #: view/admin.php:620
1575
+ msgid "We will be adding integration for it for popular user profile plugins."
1576
+ msgstr ""
1577
+
1578
+ #: view/admin.php:627
1579
+ msgid "Handle WordPress audio/video"
1580
+ msgstr ""
1581
+
1582
+ #: view/admin.php:628
1583
+ msgid "Load FV Flowplayer JS everywhere"
1584
+ msgstr ""
1585
+
1586
+ #: view/admin.php:628
1587
+ msgid ""
1588
+ "If you use some special JavaScript integration you might prefer this option."
1589
+ msgstr ""
1590
+
1591
+ #: view/admin.php:628
1592
+ msgid ""
1593
+ "Otherwise our JavaScript only loads if the shortcode is found in any of the "
1594
+ "posts being currently displayed. Required if you load content using Ajax, "
1595
+ "like in various LMS systems."
1596
+ msgstr ""
1597
+
1598
+ #: view/admin.php:629
1599
+ msgid "Optimize FV Flowplayer JS loading"
1600
+ msgstr ""
1601
+
1602
+ #: view/admin.php:629
1603
+ msgid "Helps with Google PageSpeed scores."
1604
+ msgstr ""
1605
+
1606
+ #: view/admin.php:629
1607
+ msgid ""
1608
+ "FV Player JavaScript will be only loaded once the user user start to use the "
1609
+ "page or on video tap."
1610
+ msgstr ""
1611
+
1612
+ #: view/admin.php:630
1613
+ msgid "Parse old shortcodes with commas"
1614
+ msgstr ""
1615
+
1616
+ #: view/admin.php:630
1617
+ msgid ""
1618
+ "Older versions of this plugin used commas to sepparate shortcode parameters."
1619
+ msgstr ""
1620
+
1621
+ #: view/admin.php:630
1622
+ msgid ""
1623
+ "This option will make sure it works with current version. Turn this off if "
1624
+ "you have some problems with display or other plugins which use shortcodes."
1625
+ msgstr ""
1626
+
1627
+ #: view/admin.php:631
1628
+ msgid "Parse Vimeo and YouTube links"
1629
+ msgstr ""
1630
+
1631
+ #: view/admin.php:631
1632
+ msgid ""
1633
+ "Affects comments, bbPress and BuddyPress. These links will be displayed as "
1634
+ "videos."
1635
+ msgstr ""
1636
+
1637
+ #: view/admin.php:631
1638
+ msgid ""
1639
+ "This option makes most sense together with FV Player Pro as it embeds these "
1640
+ "videos using FV Player. Enables use of shortcodes in comments and bbPress."
1641
+ msgstr ""
1642
+
1643
+ #: view/admin.php:632
1644
+ msgid "Post Thumbnail"
1645
+ msgstr ""
1646
+
1647
+ #: view/admin.php:632
1648
+ msgid ""
1649
+ "Setting a video splash screen from the media library will automatically make "
1650
+ "it the splash image if there is none."
1651
+ msgstr ""
1652
+
1653
+ #: view/admin.php:633
1654
+ msgid "Prefer Flash player by default"
1655
+ msgstr ""
1656
+
1657
+ #: view/admin.php:633
1658
+ msgid "Provides greater compatibility."
1659
+ msgstr ""
1660
+
1661
+ #: view/admin.php:633
1662
+ msgid ""
1663
+ "We use Flash for MP4 files in IE9-10 and M4V files in Firefox regardless of "
1664
+ "this setting."
1665
+ msgstr ""
1666
+
1667
+ #: view/admin.php:634
1668
+ msgid "RTMP bufferTime tweak"
1669
+ msgstr ""
1670
+
1671
+ #: view/admin.php:634
1672
+ msgid "Use if your live streams are not smooth."
1673
+ msgstr ""
1674
+
1675
+ #: view/admin.php:634
1676
+ msgid ""
1677
+ "Adobe <a href=\"http://help.adobe.com/en_US/FlashPlatform/reference/"
1678
+ "actionscript/3/flash/net/NetStream.html#bufferTime\">recommends</a> to set "
1679
+ "bufferTime to 0 for live streams, but if your stream is not smooth, you can "
1680
+ "use this setting."
1681
+ msgstr ""
1682
+
1683
+ #: view/admin.php:637
1684
+ msgid "Scan video length"
1685
+ msgstr ""
1686
+
1687
+ #: view/admin.php:642
1688
+ msgid "Turn off if you experience issues when saving posts!"
1689
+ msgstr ""
1690
+
1691
+ #: view/admin.php:643
1692
+ msgid "Turn on to enable video duration scanning."
1693
+ msgstr ""
1694
+
1695
+ #: view/admin.php:658
1696
+ #, php-format
1697
+ msgid "Currently %d videos in database and %s posts in queue."
1698
+ msgstr ""
1699
+
1700
+ #: view/admin.php:660
1701
+ #, php-format
1702
+ msgid "Currently %d videos in database."
1703
+ msgstr ""
1704
+
1705
+ #: view/admin.php:662
1706
+ #, php-format
1707
+ msgid "Currently %s posts in queue."
1708
+ msgstr ""
1709
+
1710
+ #: view/admin.php:692
1711
+ msgid "Use native fullscreen on mobile"
1712
+ msgstr ""
1713
+
1714
+ #: view/admin.php:692
1715
+ msgid ""
1716
+ "Stops popups, ads or subtitles from working, but provides faster interface. "
1717
+ "We set this for Android < 4.4 and iOS < 7 automatically."
1718
+ msgstr ""
1719
+
1720
+ #: view/admin.php:693
1721
+ msgid "Force fullscreen on mobile"
1722
+ msgstr ""
1723
+
1724
+ #: view/admin.php:693
1725
+ msgid ""
1726
+ "Video playback will start in fullscreen. iPhone with iOS < 10 always forces "
1727
+ "fullscreen for video playback."
1728
+ msgstr ""
1729
+
1730
+ #: view/admin.php:694
1731
+ msgid "Alternative iOS fullscreen mode"
1732
+ msgstr ""
1733
+
1734
+ #: view/admin.php:694
1735
+ msgid ""
1736
+ "Works for iOS < 12 which doesn't support HTML5 fullscreen. Only use if you "
1737
+ "see site elements such as header bar ovelaying the player in fullscreen on "
1738
+ "iOS."
1739
+ msgstr ""
1740
+
1741
+ #: view/admin.php:695
1742
+ msgid "Force landscape orientation in fullscreen"
1743
+ msgstr ""
1744
+
1745
+ #: view/admin.php:695
1746
+ msgid "Works on the Android mobile, not supported on iOS unfortunately."
1747
+ msgstr ""
1748
+
1749
+ #: view/admin.php:710
1750
+ msgid "Use Schema.org markup"
1751
+ msgstr ""
1752
+
1753
+ #: view/admin.php:710
1754
+ msgid " Adds the video meta data information for search engines."
1755
+ msgstr ""
1756
+
1757
+ #: view/admin.php:734
1758
+ msgid "None"
1759
+ msgstr ""
1760
+
1761
+ #: view/admin.php:735
1762
+ msgid "Random"
1763
+ msgstr ""
1764
+
1765
+ #: view/admin.php:757
1766
+ msgid "Default Popup"
1767
+ msgstr ""
1768
+
1769
+ #: view/admin.php:760
1770
+ msgid ""
1771
+ "You can set a default popup here and then skip it for individual videos."
1772
+ msgstr ""
1773
+
1774
+ #: view/admin.php:776
1775
+ msgid "Add any popups here which you would like to use with multiple videos."
1776
+ msgstr ""
1777
+
1778
+ #: view/admin.php:804 view/admin.php:1055
1779
+ msgid "Name"
1780
+ msgstr ""
1781
+
1782
+ #: view/admin.php:812
1783
+ msgid "Custom<br />CSS"
1784
+ msgstr ""
1785
+
1786
+ #: view/admin.php:820
1787
+ msgid "Show on pause"
1788
+ msgstr ""
1789
+
1790
+ #: view/admin.php:822
1791
+ msgid "Disable"
1792
+ msgstr ""
1793
+
1794
+ #: view/admin.php:835
1795
+ msgid "Add more Popups"
1796
+ msgstr ""
1797
+
1798
+ #: view/admin.php:866
1799
+ msgid "Which features should be available in shortcode editor?"
1800
+ msgstr ""
1801
+
1802
+ #: view/admin.php:868 view/admin.php:1615 view/admin.php:1756
1803
+ msgid "Ads"
1804
+ msgstr ""
1805
+
1806
+ #: view/admin.php:869
1807
+ msgid "Align"
1808
+ msgstr ""
1809
+
1810
+ #: view/admin.php:870
1811
+ msgid "Allow Video Uploads"
1812
+ msgstr ""
1813
+
1814
+ #: view/admin.php:870
1815
+ msgid ""
1816
+ "Enables the WP Media Library integraton if you want to host videos on your "
1817
+ "own server"
1818
+ msgstr ""
1819
+
1820
+ #: view/admin.php:872 view/admin.php:1313
1821
+ msgid "Controlbar"
1822
+ msgstr ""
1823
+
1824
+ #: view/admin.php:873
1825
+ msgid "Embed"
1826
+ msgstr ""
1827
+
1828
+ #: view/admin.php:874
1829
+ msgid "Mobile Video"
1830
+ msgstr ""
1831
+
1832
+ #: view/admin.php:875
1833
+ msgid "Playlist Auto Advance"
1834
+ msgstr ""
1835
+
1836
+ #: view/admin.php:876
1837
+ msgid "Playlist Style"
1838
+ msgstr ""
1839
+
1840
+ #: view/admin.php:877
1841
+ msgid "Playlist Item Titles"
1842
+ msgstr ""
1843
+
1844
+ #: view/admin.php:878
1845
+ msgid "Sharing Buttons"
1846
+ msgstr ""
1847
+
1848
+ #: view/admin.php:880 view/wizard.php:326
1849
+ msgid "Splash Text"
1850
+ msgstr ""
1851
+
1852
+ #: view/admin.php:881
1853
+ msgid "Sticky"
1854
+ msgstr ""
1855
+
1856
+ #: view/admin.php:882 view/wizard.php:336
1857
+ msgid "Synopsis"
1858
+ msgstr ""
1859
+
1860
+ #: view/admin.php:883
1861
+ msgid "Video Actions"
1862
+ msgstr ""
1863
+
1864
+ #: view/admin.php:883
1865
+ msgid ""
1866
+ "Enables end of playlist actions like Loop, Redirect, Show popup and Show "
1867
+ "splash screen"
1868
+ msgstr ""
1869
+
1870
+ #: view/admin.php:905
1871
+ msgid ""
1872
+ "Valid license found, click the button at the top of the screen to install FV "
1873
+ "Player Pro!"
1874
+ msgstr ""
1875
+
1876
+ #: view/admin.php:907
1877
+ msgid "Purchase FV Flowplayer license"
1878
+ msgstr ""
1879
+
1880
+ #: view/admin.php:907
1881
+ msgid "to enable Pro features!"
1882
+ msgstr ""
1883
+
1884
+ #: view/admin.php:911
1885
+ msgid "Advanced Vimeo embeding"
1886
+ msgstr ""
1887
+
1888
+ #: view/admin.php:915
1889
+ msgid "Use Vimeo as your video host and use all of FV Flowplayer features."
1890
+ msgstr ""
1891
+
1892
+ #: view/admin.php:920
1893
+ msgid "Advanced YouTube embeding"
1894
+ msgstr ""
1895
+
1896
+ #: view/admin.php:924
1897
+ msgid "Use YouTube as your video host and use all of FV Flowplayer features."
1898
+ msgstr ""
1899
+
1900
+ #: view/admin.php:929
1901
+ msgid "Enable user defined AB loop"
1902
+ msgstr ""
1903
+
1904
+ #: view/admin.php:933
1905
+ msgid "Let your users repeat the parts of the video which they like!"
1906
+ msgstr ""
1907
+
1908
+ #: view/admin.php:942
1909
+ msgid "Enables Lightbox video gallery to show videos in a lightbox popup!"
1910
+ msgstr ""
1911
+
1912
+ #: view/admin.php:947
1913
+ msgid "Enable quality switching"
1914
+ msgstr ""
1915
+
1916
+ #: view/admin.php:951
1917
+ msgid ""
1918
+ "Upload your videos in multiple quality for best user experience with YouTube-"
1919
+ "like quality switching!"
1920
+ msgstr ""
1921
+
1922
+ #: view/admin.php:956
1923
+ msgid "Amazon CloudFront protected content"
1924
+ msgstr ""
1925
+
1926
+ #: view/admin.php:960
1927
+ msgid "Protect your Amazon CDN hosted videos"
1928
+ msgstr ""
1929
+
1930
+ #: view/admin.php:965
1931
+ msgid "Autoplay just once"
1932
+ msgstr ""
1933
+
1934
+ #: view/admin.php:969
1935
+ msgid "Makes sure each video autoplays only once for each visitor."
1936
+ msgstr ""
1937
+
1938
+ #: view/admin.php:974
1939
+ msgid "Enable video ads"
1940
+ msgstr ""
1941
+
1942
+ #: view/admin.php:978
1943
+ msgid ""
1944
+ "Define your own videos ads to play in together with your videos - postroll "
1945
+ "or prerool"
1946
+ msgstr ""
1947
+
1948
+ #: view/admin.php:983
1949
+ msgid "Upcoming pro features"
1950
+ msgstr ""
1951
+
1952
+ #: view/admin.php:986
1953
+ msgid "Enable PayWall"
1954
+ msgstr ""
1955
+
1956
+ #: view/admin.php:990
1957
+ msgid "Monetize the video content on your membership site."
1958
+ msgstr ""
1959
+
1960
+ #: view/admin.php:1010
1961
+ msgid "Default pre-roll ad:"
1962
+ msgstr ""
1963
+
1964
+ #: view/admin.php:1018
1965
+ msgid "Set which ad should be played before videos."
1966
+ msgstr ""
1967
+
1968
+ #: view/admin.php:1023
1969
+ msgid "Default post-roll ad:"
1970
+ msgstr ""
1971
+
1972
+ #: view/admin.php:1031
1973
+ msgid "Set which ad should be played after videos."
1974
+ msgstr ""
1975
+
1976
+ #: view/admin.php:1036
1977
+ msgid "Default ad skip time"
1978
+ msgstr ""
1979
+
1980
+ #: view/admin.php:1039
1981
+ msgid "Enter value in seconds"
1982
+ msgstr ""
1983
+
1984
+ #: view/admin.php:1055
1985
+ msgid "Ad name"
1986
+ msgstr ""
1987
+
1988
+ #: view/admin.php:1056
1989
+ msgid "Click URL"
1990
+ msgstr ""
1991
+
1992
+ #: view/admin.php:1056
1993
+ msgid "Clicking the video ad will open the URL in new window"
1994
+ msgstr ""
1995
+
1996
+ #: view/admin.php:1057 view/wizard.php:188 view/wizard.php:245
1997
+ msgid "Video"
1998
+ msgstr ""
1999
+
2000
+ #: view/admin.php:1057
2001
+ msgid "Enter the video URL here"
2002
+ msgstr ""
2003
+
2004
+ #: view/admin.php:1069
2005
+ msgid "Add more video ads"
2006
+ msgstr ""
2007
+
2008
+ #: view/admin.php:1140
2009
+ msgid "Hint: play the video to see live preview of the color settings"
2010
+ msgstr ""
2011
+
2012
+ #: view/admin.php:1148 view/admin.php:1717
2013
+ msgid "Skin"
2014
+ msgstr ""
2015
+
2016
+ #: view/admin.php:1199 view/admin.php:1227
2017
+ msgid "Color"
2018
+ msgstr ""
2019
+
2020
+ #: view/admin.php:1263
2021
+ msgid "Border"
2022
+ msgstr ""
2023
+
2024
+ #: view/admin.php:1270
2025
+ msgid "Controlbar Fullscreen"
2026
+ msgstr ""
2027
+
2028
+ #: view/admin.php:1277
2029
+ msgid "Border color"
2030
+ msgstr ""
2031
+
2032
+ #: view/admin.php:1286
2033
+ msgid "Bottom Margin"
2034
+ msgstr ""
2035
+
2036
+ #: view/admin.php:1288
2037
+ msgid "Enter value in em"
2038
+ msgstr ""
2039
+
2040
+ #: view/admin.php:1295
2041
+ msgid "Buffer"
2042
+ msgstr ""
2043
+
2044
+ #: view/admin.php:1304
2045
+ msgid "Canvas"
2046
+ msgstr ""
2047
+
2048
+ #: view/admin.php:1322 view/admin.php:1503
2049
+ msgid "Font Face"
2050
+ msgstr ""
2051
+
2052
+ #: view/admin.php:1324
2053
+ msgid "(inherit from template)"
2054
+ msgstr ""
2055
+
2056
+ #: view/admin.php:1337
2057
+ msgid "Player position"
2058
+ msgstr ""
2059
+
2060
+ #: view/admin.php:1340
2061
+ msgid "Centered"
2062
+ msgstr ""
2063
+
2064
+ #: view/admin.php:1349
2065
+ msgid "Progress"
2066
+ msgstr ""
2067
+
2068
+ #: view/admin.php:1358
2069
+ msgid "Time"
2070
+ msgstr ""
2071
+
2072
+ #: view/admin.php:1367
2073
+ msgid "Buttons"
2074
+ msgstr ""
2075
+
2076
+ #: view/admin.php:1377
2077
+ msgid "Timeline"
2078
+ msgstr ""
2079
+
2080
+ #: view/admin.php:1380 view/admin.php:1395
2081
+ msgid "Default"
2082
+ msgstr ""
2083
+
2084
+ #: view/admin.php:1381
2085
+ msgid "Slim"
2086
+ msgstr ""
2087
+
2088
+ #: view/admin.php:1382
2089
+ msgid "Full"
2090
+ msgstr ""
2091
+
2092
+ #: view/admin.php:1383
2093
+ msgid "Fat"
2094
+ msgstr ""
2095
+
2096
+ #: view/admin.php:1384
2097
+ msgid "Minimal"
2098
+ msgstr ""
2099
+
2100
+ #: view/admin.php:1392
2101
+ msgid "Icons"
2102
+ msgstr ""
2103
+
2104
+ #: view/admin.php:1396
2105
+ msgid "Edgy"
2106
+ msgstr ""
2107
+
2108
+ #: view/admin.php:1397
2109
+ msgid "Outlined"
2110
+ msgstr ""
2111
+
2112
+ #: view/admin.php:1398
2113
+ msgid "Playful"
2114
+ msgstr ""
2115
+
2116
+ #: view/admin.php:1417
2117
+ msgid ""
2118
+ "Hint: you can click the thumbnails to switch videos in the above player. "
2119
+ "This preview uses the horizontal playlist style."
2120
+ msgstr ""
2121
+
2122
+ #: view/admin.php:1424
2123
+ msgid "Playlist Design"
2124
+ msgstr ""
2125
+
2126
+ #: view/admin.php:1429
2127
+ msgid "2017"
2128
+ msgstr ""
2129
+
2130
+ #: view/admin.php:1430
2131
+ msgid "2017 with captions"
2132
+ msgstr ""
2133
+
2134
+ #: view/admin.php:1431
2135
+ msgid "2014"
2136
+ msgstr ""
2137
+
2138
+ #: view/admin.php:1435 view/admin.php:1519
2139
+ msgid "Background Color"
2140
+ msgstr ""
2141
+
2142
+ #: view/admin.php:1440
2143
+ msgid "Active Item"
2144
+ msgstr ""
2145
+
2146
+ #: view/admin.php:1445
2147
+ msgid "Font Color"
2148
+ msgstr ""
2149
+
2150
+ #: view/admin.php:1450
2151
+ msgid "Use custom color"
2152
+ msgstr ""
2153
+
2154
+ #: view/admin.php:1451
2155
+ msgid "Inherit from theme"
2156
+ msgstr ""
2157
+
2158
+ #: view/admin.php:1474
2159
+ #, php-format
2160
+ msgid ""
2161
+ "Check our <a href=\"%s\" target=\"_blank\">CSS Tips and Fixes</a> guide for "
2162
+ "someusefull CSS tweaks for FV Player."
2163
+ msgstr ""
2164
+
2165
+ #: view/admin.php:1506
2166
+ msgid "(inherit from player)"
2167
+ msgstr ""
2168
+
2169
+ #: view/admin.php:1514
2170
+ msgid "Font Size"
2171
+ msgstr ""
2172
+
2173
+ #: view/admin.php:1515 view/admin.php:1559
2174
+ msgid "Enter value in pixels"
2175
+ msgstr ""
2176
+
2177
+ #: view/admin.php:1532
2178
+ msgid "The quick brown fox jumps over the lazy dog."
2179
+ msgstr ""
2180
+
2181
+ #: view/admin.php:1533
2182
+ msgid "Second line."
2183
+ msgstr ""
2184
+
2185
+ #: view/admin.php:1543
2186
+ msgid ""
2187
+ "This feature lets your viewers continue watching the video as they scroll "
2188
+ "past it. It applies to desktop computer displays - minimal width of 1020 "
2189
+ "pixels."
2190
+ msgstr ""
2191
+
2192
+ #: view/admin.php:1545
2193
+ msgid "Enable"
2194
+ msgstr ""
2195
+
2196
+ #: view/admin.php:1547
2197
+ msgid "Placement"
2198
+ msgstr ""
2199
+
2200
+ #: view/admin.php:1558
2201
+ msgid "Player width [px]"
2202
+ msgstr ""
2203
+
2204
+ #: view/admin.php:1579
2205
+ msgid "Basic Setup"
2206
+ msgstr ""
2207
+
2208
+ #: view/admin.php:1582
2209
+ msgid "Installation"
2210
+ msgstr ""
2211
+
2212
+ #: view/admin.php:1583
2213
+ msgid "Start up guide"
2214
+ msgstr ""
2215
+
2216
+ #: view/admin.php:1584 view/admin.php:1731
2217
+ msgid "Post Interface Options"
2218
+ msgstr ""
2219
+
2220
+ #: view/admin.php:1585
2221
+ msgid "Alignment Settings"
2222
+ msgstr ""
2223
+
2224
+ #: view/admin.php:1587
2225
+ msgid "Customizing FV Player Skin"
2226
+ msgstr ""
2227
+
2228
+ #: view/admin.php:1588
2229
+ msgid "Sharing Videos on Social Media"
2230
+ msgstr ""
2231
+
2232
+ #: view/admin.php:1589
2233
+ msgid "Email Sharing"
2234
+ msgstr ""
2235
+
2236
+ #: view/admin.php:1590
2237
+ msgid "Using the Iframe Embedding"
2238
+ msgstr ""
2239
+
2240
+ #: view/admin.php:1591
2241
+ msgid "Using the Video Lightbox Effect"
2242
+ msgstr ""
2243
+
2244
+ #: view/admin.php:1592
2245
+ msgid "Video Encoding for HTML 5"
2246
+ msgstr ""
2247
+
2248
+ #: view/admin.php:1593
2249
+ msgid "How to Create Playlists"
2250
+ msgstr ""
2251
+
2252
+ #: view/admin.php:1594
2253
+ msgid "VTT Chapters"
2254
+ msgstr ""
2255
+
2256
+ #: view/admin.php:1595
2257
+ msgid "Adding Titles and Splash Text"
2258
+ msgstr ""
2259
+
2260
+ #: view/admin.php:1596
2261
+ msgid "Setting Up Video Quality Switching"
2262
+ msgstr ""
2263
+
2264
+ #: view/admin.php:1597
2265
+ msgid "How to Use the Built-in Video Checker"
2266
+ msgstr ""
2267
+
2268
+ #: view/admin.php:1598
2269
+ msgid "Creating Video Links in FV Player"
2270
+ msgstr ""
2271
+
2272
+ #: view/admin.php:1599
2273
+ msgid "Switching FV Player Pro to Beta"
2274
+ msgstr ""
2275
+
2276
+ #: view/admin.php:1600
2277
+ msgid "FAQ"
2278
+ msgstr ""
2279
+
2280
+ #: view/admin.php:1601
2281
+ msgid "WordPress Video Plugins Comparison"
2282
+ msgstr ""
2283
+
2284
+ #: view/admin.php:1602
2285
+ msgid "List of Shortcode Parameters"
2286
+ msgstr ""
2287
+
2288
+ #: view/admin.php:1604
2289
+ msgid "Video Hosting"
2290
+ msgstr ""
2291
+
2292
+ #: view/admin.php:1607
2293
+ msgid "Using YouTube with FV Player"
2294
+ msgstr ""
2295
+
2296
+ #: view/admin.php:1608
2297
+ msgid "How to Use Vimeo with WordPress"
2298
+ msgstr ""
2299
+
2300
+ #: view/admin.php:1609
2301
+ msgid "Serving Private Videos with Amazon S3"
2302
+ msgstr ""
2303
+
2304
+ #: view/admin.php:1610
2305
+ msgid "Serving Private Videos via CloudFront"
2306
+ msgstr ""
2307
+
2308
+ #: view/admin.php:1611
2309
+ msgid "Using BunnyCDN with FV Player Pro"
2310
+ msgstr ""
2311
+
2312
+ #: view/admin.php:1612
2313
+ msgid "Using KeyCDN With FV Player"
2314
+ msgstr ""
2315
+
2316
+ #: view/admin.php:1613
2317
+ msgid "Using HLS With FV Player"
2318
+ msgstr ""
2319
+
2320
+ #: view/admin.php:1618
2321
+ msgid "Advertising Options with FV Player"
2322
+ msgstr ""
2323
+
2324
+ #: view/admin.php:1619
2325
+ msgid "Custom Video Ads in FV Player (pre-roll and post-roll)"
2326
+ msgstr ""
2327
+
2328
+ #: view/admin.php:1620
2329
+ msgid "Overlay Ads in FV Player"
2330
+ msgstr ""
2331
+
2332
+ #: view/admin.php:1621
2333
+ msgid "Google Video Advertising Options"
2334
+ msgstr ""
2335
+
2336
+ #: view/admin.php:1622
2337
+ msgid "Incorporating Google Ads (AdSense)"
2338
+ msgstr ""
2339
+
2340
+ #: view/admin.php:1623
2341
+ msgid "Video Actions: HTML Pop-ups"
2342
+ msgstr ""
2343
+
2344
+ #: view/admin.php:1624
2345
+ msgid "Using ExoClick Ads With FV Player"
2346
+ msgstr ""
2347
+
2348
+ #: view/admin.php:1628
2349
+ msgid "Advanced"
2350
+ msgstr ""
2351
+
2352
+ #: view/admin.php:1631
2353
+ msgid "How to use FV Player Widget"
2354
+ msgstr ""
2355
+
2356
+ #: view/admin.php:1632
2357
+ msgid "Setting up Video Custom Fields"
2358
+ msgstr ""
2359
+
2360
+ #: view/admin.php:1633
2361
+ msgid "Using Google Analytics with FV Player"
2362
+ msgstr ""
2363
+
2364
+ #: view/admin.php:1634
2365
+ msgid "AB Loop Function"
2366
+ msgstr ""
2367
+
2368
+ #: view/admin.php:1635
2369
+ msgid "How to Create Subtitles"
2370
+ msgstr ""
2371
+
2372
+ #: view/admin.php:1636
2373
+ msgid "Interactive Video Transcript"
2374
+ msgstr ""
2375
+
2376
+ #: view/admin.php:1637
2377
+ msgid "How to Use Custom Start/End Time"
2378
+ msgstr ""
2379
+
2380
+ #: view/admin.php:1638 view/admin.php:1746
2381
+ msgid "Sticky Video"
2382
+ msgstr ""
2383
+
2384
+ #: view/admin.php:1639
2385
+ msgid "CSS Tips and Fixes"
2386
+ msgstr ""
2387
+
2388
+ #: view/admin.php:1640
2389
+ msgid "Using FV Player with Minify Plugins"
2390
+ msgstr ""
2391
+
2392
+ #: view/admin.php:1641
2393
+ msgid "How to Use the Speed Buttons"
2394
+ msgstr ""
2395
+
2396
+ #: view/admin.php:1642
2397
+ msgid "Using FV Player with Sub-domains and Multi-Domains"
2398
+ msgstr ""
2399
+
2400
+ #: view/admin.php:1643
2401
+ msgid "FV Player Profile Videos"
2402
+ msgstr ""
2403
+
2404
+ #: view/admin.php:1644
2405
+ msgid "Video Downloading With Simple History Support"
2406
+ msgstr ""
2407
+
2408
+ #: view/admin.php:1645
2409
+ msgid "Email Subscription Form Pop-ups"
2410
+ msgstr ""
2411
+
2412
+ #: view/admin.php:1646
2413
+ msgid "Using FV Player With AMP"
2414
+ msgstr ""
2415
+
2416
+ #: view/admin.php:1647
2417
+ msgid "Programmer&#8217;s Guide"
2418
+ msgstr ""
2419
+
2420
+ #: view/admin.php:1648
2421
+ msgid "FV WordPress Flowplayer Downgrading"
2422
+ msgstr ""
2423
+
2424
+ #: view/admin.php:1649
2425
+ msgid "Changelog"
2426
+ msgstr ""
2427
+
2428
+ #: view/admin.php:1650
2429
+ msgid "Incompatible Plugins and Scripts"
2430
+ msgstr ""
2431
+
2432
+ #: view/admin.php:1652
2433
+ msgid "Securing Your Video"
2434
+ msgstr ""
2435
+
2436
+ #: view/admin.php:1655
2437
+ msgid "How to Protect Your Videos from Being Downloaded"
2438
+ msgstr ""
2439
+
2440
+ #: view/admin.php:1656
2441
+ msgid "How to use RTMP streams with Flash"
2442
+ msgstr ""
2443
+
2444
+ #: view/admin.php:1657
2445
+ msgid "How to setup encrypted HLS stream with Amazon Elastic Transcoder"
2446
+ msgstr ""
2447
+
2448
+ #: view/admin.php:1658
2449
+ msgid "Protecting Videos With DRM Text"
2450
+ msgstr ""
2451
+
2452
+ #: view/admin.php:1660
2453
+ msgid "VAST/VPAID Ads"
2454
+ msgstr ""
2455
+
2456
+ #: view/admin.php:1663
2457
+ msgid "How to Use FV Player VAST"
2458
+ msgstr ""
2459
+
2460
+ #: view/admin.php:1664
2461
+ msgid "Using URL Tags"
2462
+ msgstr ""
2463
+
2464
+ #: view/admin.php:1665
2465
+ msgid "VAST Tester"
2466
+ msgstr ""
2467
+
2468
+ #: view/admin.php:1666
2469
+ msgid "Tracking VAST and VPAID Ads With Google Analytics"
2470
+ msgstr ""
2471
+
2472
+ #: view/admin.php:1667
2473
+ msgid "Using FV Player VAST Outside WordPress"
2474
+ msgstr ""
2475
+
2476
+ #: view/admin.php:1668
2477
+ msgid "List of Sample VAST/VPAID Ad Tags"
2478
+ msgstr ""
2479
+
2480
+ #: view/admin.php:1694
2481
+ msgid ""
2482
+ "Check this box if you would like FV Player to completely remove all of its "
2483
+ "data when the plugin is deleted. The <code>[fvplayer]</code> shortcodes will "
2484
+ "stop working."
2485
+ msgstr ""
2486
+
2487
+ #: view/admin.php:1696
2488
+ msgid "Remove all data"
2489
+ msgstr ""
2490
+
2491
+ #: view/admin.php:1696
2492
+ msgid ""
2493
+ "This action is irreversible, please backup your website if you are not "
2494
+ "absolutely sure."
2495
+ msgstr ""
2496
+
2497
+ #: view/admin.php:1716
2498
+ msgid "Setup"
2499
+ msgstr ""
2500
+
2501
+ #: view/admin.php:1718
2502
+ msgid "Hosting"
2503
+ msgstr ""
2504
+
2505
+ #: view/admin.php:1719 view/wizard.php:191
2506
+ msgid "Actions"
2507
+ msgstr ""
2508
+
2509
+ #: view/admin.php:1720 view/admin.php:1761
2510
+ msgid "Video Ads"
2511
+ msgstr ""
2512
+
2513
+ #: view/admin.php:1721
2514
+ msgid "Tools"
2515
+ msgstr ""
2516
+
2517
+ #: view/admin.php:1722
2518
+ msgid "Help"
2519
+ msgstr ""
2520
+
2521
+ #: view/admin.php:1732
2522
+ msgid "Sitewide FV Player Defaults"
2523
+ msgstr ""
2524
+
2525
+ #: view/admin.php:1733
2526
+ msgid "Integrations/Compatibility"
2527
+ msgstr ""
2528
+
2529
+ #: view/admin.php:1734
2530
+ msgid "Mobile Settings"
2531
+ msgstr ""
2532
+
2533
+ #: view/admin.php:1735
2534
+ msgid "Video SEO"
2535
+ msgstr ""
2536
+
2537
+ #: view/admin.php:1737
2538
+ msgid "Pro Features"
2539
+ msgstr ""
2540
+
2541
+ #: view/admin.php:1742
2542
+ msgid "Player Skin"
2543
+ msgstr ""
2544
+
2545
+ #: view/admin.php:1743 view/wizard.php:187
2546
+ msgid "Playlist"
2547
+ msgstr ""
2548
+
2549
+ #: view/admin.php:1744
2550
+ msgid "Custom CSS"
2551
+ msgstr ""
2552
+
2553
+ #: view/admin.php:1750
2554
+ msgid "Amazon S3 Protected Content"
2555
+ msgstr ""
2556
+
2557
+ #: view/admin.php:1754
2558
+ msgid "End of Video"
2559
+ msgstr ""
2560
+
2561
+ #: view/admin.php:1755
2562
+ msgid "Custom Popups"
2563
+ msgstr ""
2564
+
2565
+ #: view/admin.php:1766
2566
+ msgid "Rollback"
2567
+ msgstr ""
2568
+
2569
+ #: view/admin.php:1767
2570
+ msgid "Uninstall"
2571
+ msgstr ""
2572
+
2573
+ #: view/admin.php:1770
2574
+ msgid "Usage"
2575
+ msgstr ""
2576
+
2577
+ #: view/admin.php:1776
2578
+ msgid "Documentation"
2579
+ msgstr ""
2580
+
2581
+ #: view/admin.php:1806
2582
+ msgid "Enable the Pro extension"
2583
+ msgstr ""
2584
+
2585
+ #: view/admin.php:1808
2586
+ msgid "Pro pack installed"
2587
+ msgstr ""
2588
+
2589
+ #: view/admin.php:1810
2590
+ msgid "Install Pro extension"
2591
+ msgstr ""
2592
+
2593
+ #: view/admin.php:1813
2594
+ msgid "Apply Pro upgrade"
2595
+ msgstr ""
2596
+
2597
+ #: view/admin.php:1815
2598
+ msgid "Check template"
2599
+ msgstr ""
2600
+
2601
+ #: view/admin.php:1816
2602
+ msgid "Check videos"
2603
+ msgstr ""
2604
+
2605
+ #: view/admin.php:1817
2606
+ msgid "Commercial License Key"
2607
+ msgstr ""
2608
+
2609
+ #: view/admin.php:1819
2610
+ msgid "Check license"
2611
+ msgstr ""
2612
+
2613
+ #: view/admin.php:1822
2614
+ msgid "Click here for license info"
2615
+ msgstr ""
2616
+
2617
+ #: view/admin.php:1837
2618
+ msgid "with your own branding"
2619
+ msgstr ""
2620
+
2621
+ #: view/admin.php:1839
2622
+ msgid "Put up your own logo"
2623
+ msgstr ""
2624
+
2625
+ #: view/admin.php:1840
2626
+ msgid "Or remove the logo completely"
2627
+ msgstr ""
2628
+
2629
+ #: view/admin.php:1841
2630
+ msgid "The best video plugin for Wordpress"
2631
+ msgstr ""
2632
+
2633
+ #: view/admin.php:1843
2634
+ msgid "Easter sale!"
2635
+ msgstr ""
2636
+
2637
+ #: view/admin.php:1843
2638
+ msgid "All Licenses 20% Off"
2639
+ msgstr ""
2640
+
2641
+ #: view/wizard.php:174
2642
+ msgid "Add your video"
2643
+ msgstr ""
2644
+
2645
+ #: view/wizard.php:177
2646
+ msgid "Playlist too long, click here for preview"
2647
+ msgstr ""
2648
+
2649
+ #: view/wizard.php:192
2650
+ msgid "Embeds"
2651
+ msgstr ""
2652
+
2653
+ #: view/wizard.php:201
2654
+ msgid "Add splash images to enable thumbnail view"
2655
+ msgstr ""
2656
+
2657
+ #: view/wizard.php:244
2658
+ msgid "(remove)"
2659
+ msgstr ""
2660
+
2661
+ #: view/wizard.php:250 view/wizard.php:268 view/wizard.php:278
2662
+ #: view/wizard.php:313
2663
+ msgid "Add Video"
2664
+ msgstr ""
2665
+
2666
+ #: view/wizard.php:252 view/wizard.php:270 view/wizard.php:280
2667
+ msgid "FV Player Pro is required to use this video type in playlist."
2668
+ msgstr ""
2669
+
2670
+ #: view/wizard.php:259
2671
+ msgid "Video Duration"
2672
+ msgstr ""
2673
+
2674
+ #: view/wizard.php:260
2675
+ msgid "File size"
2676
+ msgstr ""
2677
+
2678
+ #: view/wizard.php:266 view/wizard.php:276
2679
+ msgid "Another format"
2680
+ msgstr ""
2681
+
2682
+ #: view/wizard.php:286 view/wizard.php:416
2683
+ msgid "Size"
2684
+ msgstr ""
2685
+
2686
+ #: view/wizard.php:295
2687
+ msgid "RTMP Server"
2688
+ msgstr ""
2689
+
2690
+ #: view/wizard.php:295
2691
+ msgid "Leave empty to use Flash streaming server from plugin settings"
2692
+ msgstr ""
2693
+
2694
+ #: view/wizard.php:298
2695
+ msgid "RTMP Path"
2696
+ msgstr ""
2697
+
2698
+ #: view/wizard.php:305
2699
+ msgid "Add another format"
2700
+ msgstr ""
2701
+
2702
+ #: view/wizard.php:305
2703
+ msgid "(i.e. WebM, OGV)"
2704
+ msgstr ""
2705
+
2706
+ #: view/wizard.php:306
2707
+ msgid "Add RTMP"
2708
+ msgstr ""
2709
+
2710
+ #: view/wizard.php:310
2711
+ msgid "Mobile video"
2712
+ msgstr ""
2713
+
2714
+ #: view/wizard.php:311
2715
+ msgid "Put low-bandwidth video here or leave blank"
2716
+ msgstr ""
2717
+
2718
+ #: view/wizard.php:321
2719
+ msgid "Add Image"
2720
+ msgstr ""
2721
+
2722
+ #: view/wizard.php:331
2723
+ msgid "Title"
2724
+ msgstr ""
2725
+
2726
+ #: view/wizard.php:341
2727
+ msgid "Live stream"
2728
+ msgstr ""
2729
+
2730
+ #: view/wizard.php:346
2731
+ msgid "DVR stream"
2732
+ msgstr ""
2733
+
2734
+ #: view/wizard.php:351
2735
+ msgid "Audio stream"
2736
+ msgstr ""
2737
+
2738
+ #: view/wizard.php:360
2739
+ msgid ""
2740
+ "Admin note: Video uploads are currently disabled, set Allow User Uploads to "
2741
+ "true in"
2742
+ msgstr ""
2743
+
2744
+ #: view/wizard.php:360
2745
+ msgid "Settings"
2746
+ msgstr ""
2747
+
2748
+ #: view/wizard.php:391
2749
+ msgid "Add Subtitles"
2750
+ msgstr ""
2751
+
2752
+ #: view/wizard.php:405
2753
+ msgid "Add Another Language"
2754
+ msgstr ""
2755
+
2756
+ #: view/wizard.php:475
2757
+ msgid "Redirect to"
2758
+ msgstr ""
2759
+
2760
+ #: view/wizard.php:480
2761
+ msgid "End popup"
2762
+ msgstr ""
2763
+
2764
+ #: view/wizard.php:484
2765
+ msgid "You are using the legacy popup functionality. Move the popup code"
2766
+ msgstr ""
2767
+
2768
+ #: view/wizard.php:484
2769
+ msgid "here"
2770
+ msgstr ""
2771
+
2772
+ #: view/wizard.php:484
2773
+ msgid ", then use the drop down menu above."
2774
+ msgstr ""
2775
+
2776
+ #: view/wizard.php:509
2777
+ msgid "Ad code"
2778
+ msgstr ""
2779
+
2780
+ #: view/wizard.php:515
2781
+ msgid "Ad Size"
2782
+ msgstr ""
2783
+
2784
+ #: view/wizard.php:519
2785
+ msgid "Skip global ad in this video"
2786
+ msgstr ""
2787
+
2788
+ #: view/wizard.php:542
2789
+ msgid "Insert"
2790
+ msgstr ""
2791
+
2792
+ #: view/wizard.php:543
2793
+ msgid " + Add playlist item"
2794
+ msgstr ""
2795
+
2796
+ #: view/wizard.php:544
2797
+ msgid "Add another video into playlist"
2798
+ msgstr ""
2799
+
2800
+ #: view/wizard.php:544
2801
+ msgid "Back to playlist"
2802
+ msgstr ""
2803
+
2804
+ #: view/wizard.php:550
2805
+ msgid "Pick existing player"
2806
+ msgstr ""
models/cdn.class.php CHANGED
@@ -38,7 +38,7 @@ abstract class FV_Player_CDN {
38
 
39
  if( stripos($aVideo['src'],$sDomain) !== false ) {
40
  $bFound = true;
41
- $aVideo['src'] = $this->secure_link($aVideo['src'],$this->aSecureTokens[$i]);
42
  $_POST['sources'][$key] = $aVideo;
43
  }
44
  }
@@ -47,7 +47,7 @@ abstract class FV_Player_CDN {
47
 
48
  if( $bFound ) {
49
  echo '<FVFLOWPLAYER>';
50
- echo json_encode($_POST['sources']);
51
  echo '</FVFLOWPLAYER>';
52
  die();
53
  }
38
 
39
  if( stripos($aVideo['src'],$sDomain) !== false ) {
40
  $bFound = true;
41
+ $aVideo['src'] = $this->secure_link($aVideo['src'],$this->aSecureTokens[$i]);
42
  $_POST['sources'][$key] = $aVideo;
43
  }
44
  }
47
 
48
  if( $bFound ) {
49
  echo '<FVFLOWPLAYER>';
50
+ echo json_encode($_POST['sources']);
51
  echo '</FVFLOWPLAYER>';
52
  die();
53
  }
models/digitalocean-spaces-browser.class.php CHANGED
@@ -11,15 +11,21 @@ class FV_Player_DigitalOcean_Spaces_Browser extends FV_Player_Media_Browser {
11
  }
12
  }
13
 
14
- // Legacy
15
- function init_for_gutenberg() {}
 
16
 
17
- function fv_wp_flowplayer_include_aws_sdk() {
18
- if ( ! class_exists( 'Aws\S3\S3Client' ) ) {
19
- require_once( dirname( __FILE__ ) . "/../vendor/autoload.php" );
20
- }
 
 
21
  }
22
 
 
 
 
23
  function get_s3_client() {
24
  global $fv_fp, $FV_Player_DigitalOcean_Spaces;
25
 
@@ -42,103 +48,23 @@ class FV_Player_DigitalOcean_Spaces_Browser extends FV_Player_Media_Browser {
42
  }
43
 
44
  function get_formatted_assets_data() {
45
- $this->fv_wp_flowplayer_include_aws_sdk();
46
  global $fv_fp, $s3Client;
47
 
48
  $bucket = $fv_fp->_get_option(array('digitalocean_spaces','space'));
49
  //$domain = $fv_fp->_get_option(array('digitalocean_spaces','space'));
50
 
51
- $output = array(
52
- 'name' => 'Home',
53
- 'type' => 'folder',
54
- 'path' => !empty($_POST['path']) ? $_POST['path'] : 'Home/',
55
- 'items' => array()
56
- );
57
 
58
  // instantiate the S3 client with AWS credentials
59
  $s3Client = $this->get_s3_client();
60
 
61
  try {
62
- $args = array(
63
- 'Bucket' => $bucket,
64
- 'Delimiter' => '/',
65
- );
66
-
67
- $request_path = !empty($_POST['path']) ? str_replace( 'Home/', '', stripslashes($_POST['path']) ) : false;
68
-
69
- if( $request_path ) {
70
- $args['Prefix'] = $request_path;
71
- }
72
-
73
- $paged = $s3Client->getPaginator('ListObjects',$args);
74
-
75
- $date_format = get_option( 'date_format' );
76
- foreach( $paged AS $res ) {
77
-
78
- $folders = !empty($res['CommonPrefixes']) ? $res['CommonPrefixes'] : array();
79
- $files = $res->get('Contents');
80
- if( !$files ) $files = array();
81
-
82
- $objects = array_merge( $folders, $files );
83
-
84
- foreach ( $objects as $object ) {
85
- if ( ! isset( $objectarray ) ) {
86
- $objectarray = array();
87
- }
88
-
89
- $item = array();
90
-
91
- $path = $object['Prefix'] ? $object['Prefix'] : $object['Key'];
92
-
93
- $item['path'] = 'Home/' . $path;
94
-
95
- if( $request_path ) {
96
- if( $request_path == $path ) continue; // sometimes the current folder is present in the response, weird
97
-
98
- $item['name'] = str_replace( $request_path, '', $path );
99
- } else {
100
- $item['name'] = $path;
101
- }
102
-
103
- if( !empty($object['Size']) ) {
104
- $item['type'] = 'file';
105
- $item['size'] = $object['Size'];
106
- $item['LastModified'] = $object['LastModified'];
107
- $item['modified'] = date($date_format, strtotime($object['LastModified']));
108
-
109
- $link = (string) $s3Client->getObjectUrl( $bucket, $path );
110
- $url_components = parse_url($link);
111
- $link = str_replace( $url_components['path'], urldecode($url_components['path']), $link );
112
-
113
- // TODO: check and implement custom domain URLs
114
- /*// replace link with Custom Domain URL, if we have one
115
- if( !empty($domains[$array_id]) ) {
116
- // replace S3 URLs with buckets in the S3 subdomain
117
- $link = preg_replace('/https?:\/\/' . $bucket . '\.s3[^.]*\.amazonaws\.com\/(.*)/i', rtrim($domains[$array_id], '/').'/$1', $link);
118
-
119
- // replace S3 URLs with bucket name as a subfolder
120
- $link = preg_replace('/https?:\/\/[^\/]+\/' . $bucket . '\/(.*)/i', rtrim($domains[$array_id], '/').'/$1', $link);
121
- }*/
122
-
123
- $item['link'] = $link;
124
-
125
- if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $item['name'])) {
126
- $item['splash'] = apply_filters('fv_flowplayer_splash', $link );
127
- }
128
- } else {
129
- $item['type'] = 'folder';
130
- $item['items'] = array();
131
- }
132
-
133
- $output['items'][] = $item;
134
-
135
- if (strtolower(substr($item['name'], strrpos($item['name'], '.') + 1)) === 'ts') {
136
- continue;
137
- }
138
-
139
- }
140
- }
141
 
 
 
142
  } catch ( Aws\S3\Exception\S3Exception $e ) {
143
  //echo $e->getMessage() . "\n";
144
  $err = $e->getMessage();
11
  }
12
  }
13
 
14
+ function decode_link_components( $link ) {
15
+ $url_components = parse_url($link);
16
+ $link = str_replace( $url_components['path'], urldecode($url_components['path']), $link );
17
 
18
+ return $link;
19
+ }
20
+
21
+ function get_custom_domain_url( $link, $bucket, $custom_domain ) {
22
+ // TODO: check and implement custom domain URLs - replace link with Custom Domain URL, if we have one
23
+ return $link;
24
  }
25
 
26
+ // Legacy
27
+ function init_for_gutenberg() {}
28
+
29
  function get_s3_client() {
30
  global $fv_fp, $FV_Player_DigitalOcean_Spaces;
31
 
48
  }
49
 
50
  function get_formatted_assets_data() {
51
+ $this->include_aws_sdk();
52
  global $fv_fp, $s3Client;
53
 
54
  $bucket = $fv_fp->_get_option(array('digitalocean_spaces','space'));
55
  //$domain = $fv_fp->_get_option(array('digitalocean_spaces','space'));
56
 
57
+ $output = $this->get_output();
 
 
 
 
 
58
 
59
  // instantiate the S3 client with AWS credentials
60
  $s3Client = $this->get_s3_client();
61
 
62
  try {
63
+
64
+ list( $request_path, $paged, $date_format ) = $this->get_metadata( $s3Client, $bucket );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ list($output, $sum_up ) = $this->get_output_items( $output, $s3Client, $request_path, $paged, $date_format, $bucket );
67
+
68
  } catch ( Aws\S3\Exception\S3Exception $e ) {
69
  //echo $e->getMessage() . "\n";
70
  $err = $e->getMessage();
models/digitalocean-spaces.class.php CHANGED
@@ -192,6 +192,7 @@ class FV_Player_DigitalOcean_Spaces extends FV_Player_CDN {
192
  }
193
 
194
  }
 
195
  global $FV_Player_DigitalOcean_Spaces;
196
  $FV_Player_DigitalOcean_Spaces = new FV_Player_DigitalOcean_Spaces;
197
 
192
  }
193
 
194
  }
195
+
196
  global $FV_Player_DigitalOcean_Spaces;
197
  $FV_Player_DigitalOcean_Spaces = new FV_Player_DigitalOcean_Spaces;
198
 
models/flowplayer.php CHANGED
@@ -1547,6 +1547,17 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1547
  if( method_exists('CDN_Enabler_Engine', 'rewriter') ) {
1548
  $item['sources'][$k]['src'] = CDN_Enabler_Engine::rewriter($source['src']);
1549
  }
 
 
 
 
 
 
 
 
 
 
 
1550
  }
1551
 
1552
  return $item;
@@ -2024,8 +2035,11 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
2024
 
2025
  // Uppercase first letter
2026
  foreach( $aLangs as $code => $native ) {
2027
- // $aLangs[$code] = ucfirst($native);
2028
- $aLangs[$code] = mb_convert_case($native, MB_CASE_TITLE, "UTF-8");
 
 
 
2029
  }
2030
 
2031
  ksort($aLangs);
@@ -2331,16 +2345,18 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
2331
  // 1st rule
2332
  $new_k = str_replace( 'fvp(/(.*))?', 'fvp', $k ); // fvp only
2333
  $new_v = preg_replace('/fv_player_embed=\$matches\[\d]/', 'fv_player_embed=1', $v); // fv_player_embed=1
2334
-
2335
- $aRulesNew[$new_k] = $new_v;
2336
-
2337
  // 2nd rule
2338
- $new_k = str_replace( '/fvp(/(', '/fvp((-?', $k ); // fvp{number} or fvp-{number}
 
2339
  $aRulesNew[$new_k]= $v;
2340
  } else {
2341
  $aRulesNew[$k] = $v;
2342
  }
2343
  }
 
2344
  return $aRulesNew;
2345
  }
2346
 
1547
  if( method_exists('CDN_Enabler_Engine', 'rewriter') ) {
1548
  $item['sources'][$k]['src'] = CDN_Enabler_Engine::rewriter($source['src']);
1549
  }
1550
+
1551
+ if( class_exists('BunnyCDN') && class_exists('BunnyCDNFilter') && method_exists( 'BunnyCDN', 'getOptions' ) ) {
1552
+
1553
+ require_once dirname(__FILE__) . '/../includes/class.bunnycdn.rewrite.php';
1554
+
1555
+ $options = BunnyCDN::getOptions();
1556
+
1557
+ $fv_bunnycdn = new FV_Player_BunnyCDN_Rewrite($options["site_url"], (is_ssl() ? 'https://' : 'http://') . $options["cdn_domain_name"], $options["directories"], $options["excluded"], $options["disable_admin"]);
1558
+ $item['sources'][$k]['src'] = $fv_bunnycdn->rewrite_url($source['src']);
1559
+ }
1560
+
1561
  }
1562
 
1563
  return $item;
2035
 
2036
  // Uppercase first letter
2037
  foreach( $aLangs as $code => $native ) {
2038
+ if( function_exists('mb_convert_case') ) {
2039
+ $aLangs[$code] = mb_convert_case($native, MB_CASE_TITLE, "UTF-8");
2040
+ } else {
2041
+ $aLangs[$code] = $native;
2042
+ }
2043
  }
2044
 
2045
  ksort($aLangs);
2345
  // 1st rule
2346
  $new_k = str_replace( 'fvp(/(.*))?', 'fvp', $k ); // fvp only
2347
  $new_v = preg_replace('/fv_player_embed=\$matches\[\d]/', 'fv_player_embed=1', $v); // fv_player_embed=1
2348
+
2349
+ $aRulesNew[$new_k] = $new_v;
2350
+
2351
  // 2nd rule
2352
+ $new_k = str_replace( '/fvp(/(.*))', '/fvp((-?\d+))', $k ); // fvp{number} or fvp-{number}
2353
+
2354
  $aRulesNew[$new_k]= $v;
2355
  } else {
2356
  $aRulesNew[$k] = $v;
2357
  }
2358
  }
2359
+
2360
  return $aRulesNew;
2361
  }
2362
 
models/linode-object-storage-browser.class.php ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if( !class_exists('FV_Player_Linode_Object_Storage_Browser') && class_exists('FV_Player_Media_Browser') ) :
4
+
5
+ class FV_Player_Linode_Object_Storage_Browser extends FV_Player_Media_Browser {
6
+
7
+ function init() {
8
+ if( $this->isSetUpCorrectly() ) {
9
+ global $fv_wp_flowplayer_ver;
10
+ wp_enqueue_script( 'fv-player-linode-browser', flowplayer::get_plugin_url().'/js/linode-object-storage.js', array( 'flowplayer-browser-base' ), $fv_wp_flowplayer_ver );
11
+ }
12
+ }
13
+
14
+ function decode_link_components( $link ) {
15
+ $url_components = parse_url($link);
16
+ $link = str_replace( $url_components['path'], urldecode($url_components['path']), $link );
17
+
18
+ return $link;
19
+ }
20
+
21
+ function get_custom_domain_url( $link, $bucket, $custom_domain ) {
22
+ // TODO: check and implement custom domain URLs - replace link with Custom Domain URL, if we have one
23
+ return $link;
24
+ }
25
+
26
+ // Legacy
27
+ function init_for_gutenberg() {}
28
+
29
+ function get_s3_client() {
30
+ global $fv_fp, $FV_Player_Linode_Object_Storage;
31
+
32
+ // instantiate the S3 client with AWS credentials
33
+ $endpoint = 'https://' . $FV_Player_Linode_Object_Storage->get_endpoint();
34
+
35
+ $region = $FV_Player_Linode_Object_Storage->get_region();
36
+
37
+ $secret = $fv_fp->_get_option(array('linode_object_storage','secret'));
38
+ $key = $fv_fp->_get_option(array('linode_object_storage','key'));
39
+
40
+ $credentials = new Aws\Credentials\Credentials( $key, $secret );
41
+
42
+ return Aws\S3\S3Client::factory( array(
43
+ 'credentials' => $credentials,
44
+ 'region' => $region,
45
+ 'version' => 'latest',
46
+ 'endpoint' => $endpoint
47
+ ) );
48
+ }
49
+
50
+ function get_formatted_assets_data() {
51
+ $this->include_aws_sdk();
52
+ global $fv_fp, $s3Client;
53
+
54
+ $bucket = $fv_fp->_get_option(array('linode_object_storage','space'));
55
+ //$domain = $fv_fp->_get_option(array('linode_object_storage','space'));
56
+
57
+ $output = $this->get_output();
58
+
59
+ // instantiate the S3 client with AWS credentials
60
+ $s3Client = $this->get_s3_client();
61
+
62
+ try {
63
+
64
+ list( $request_path, $paged, $date_format ) = $this->get_metadata( $s3Client, $bucket );
65
+
66
+ list($output, $sum_up ) = $this->get_output_items( $output, $s3Client, $request_path, $paged, $date_format, $bucket );
67
+
68
+ } catch ( Aws\S3\Exception\S3Exception $e ) {
69
+ //echo $e->getMessage() . "\n";
70
+ $err = $e->getMessage();
71
+ $output = array(
72
+ 'items' => array(),
73
+ 'name' => '/',
74
+ 'path' => '/',
75
+ 'type' => 'folder'
76
+ );
77
+ }
78
+
79
+ // sorting by date, descending
80
+ // TODO: Make this an interface option? How to handle it for paged listings, like on Vimeo?
81
+ function date_compare($a, $b) {
82
+ $t1 = strtotime($a['LastModified']);
83
+ $t2 = strtotime($b['LastModified']);
84
+ return $t1 - $t2;
85
+ }
86
+ usort($output['items'], 'date_compare');
87
+
88
+ $output['items'] = array_reverse($output['items']);
89
+
90
+ $json_final = array(
91
+ 'items' => $output
92
+ );
93
+
94
+ if (isset($err) && $err) {
95
+ $json_final['err'] = $err;
96
+ }
97
+
98
+ return $json_final;
99
+ }
100
+
101
+ function load_assets() {
102
+ $json_final = $this->get_formatted_assets_data();
103
+
104
+ wp_send_json( $json_final );
105
+ wp_die();
106
+ }
107
+
108
+ public function isSetUpCorrectly() {
109
+ global $fv_fp;
110
+
111
+ return (
112
+ $fv_fp->_get_option(array('linode_object_storage','endpoint'))
113
+ && $fv_fp->_get_option(array('linode_object_storage','secret'))
114
+ && $fv_fp->_get_option(array('linode_object_storage','key'))
115
+ && $fv_fp->_get_option(array('linode_object_storage','space'))
116
+ );
117
+ }
118
+
119
+ }
120
+
121
+ global $FV_Player_Linode_Object_Storage_Browser;
122
+ $FV_Player_Linode_Object_Storage_Browser = new FV_Player_Linode_Object_Storage_Browser( 'wp_ajax_load_linode_object_storage_assets' );
123
+
124
+ endif;
models/linode-object-storage.class.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if( !class_exists('FV_Player_Linode_Object_Storage') ) :
4
+
5
+ class FV_Player_Linode_Object_Storage extends FV_Player_CDN {
6
+
7
+ function __construct() {
8
+ // TODO: What if FV Player is not yet loaded?
9
+ add_action( 'plugins_loaded', array( $this, 'include_linode_media_browser' ), 9 );
10
+ parent::__construct( array( 'key' => 'linode_object_storage', 'title' => 'Linode Object Storage') );
11
+ }
12
+
13
+ // includes the Digital Ocean Spaces handling class itself
14
+ public function include_linode_media_browser() {
15
+ if ( is_admin() && version_compare(phpversion(),'5.5.0') != -1 ) {
16
+ include( dirname( __FILE__ ) . '/linode-object-storage-browser.class.php' );
17
+ }
18
+ }
19
+
20
+ function get_endpoint() {
21
+ global $fv_fp;
22
+ $parsed = parse_url( $fv_fp->_get_option( array($this->key,'endpoint' ) ) );
23
+
24
+ if( count($parsed) == 1 && !empty($parsed['path']) ) {
25
+ return $parsed['path'];
26
+
27
+ } else if( !empty($parsed['host']) ) {
28
+ return $parsed['host'];
29
+
30
+ }
31
+ return false;
32
+ }
33
+
34
+ function get_domains() {
35
+ global $fv_fp;
36
+ $space = $fv_fp->_get_option( array($this->key,'space' ) );
37
+ $endpoint = $this->get_endpoint();
38
+ if( $space && $endpoint ) {
39
+ return array( $space.'.'.$endpoint, $endpoint.'/'.$space );
40
+ }
41
+ return false;
42
+ }
43
+
44
+ function get_region() {
45
+ $parts = explode( '.', $this->get_endpoint() );
46
+ return $parts[0];
47
+ }
48
+
49
+ function get_secure_tokens() {
50
+ global $fv_fp;
51
+ return $fv_fp->_get_option( array($this->key,'key' ) ) && $fv_fp->_get_option( array($this->key,'secret' ) );
52
+ }
53
+
54
+ function options() {
55
+ // TODO: Fix width
56
+ // TODO: Add custom domain for CDN
57
+ global $fv_fp;
58
+ ?>
59
+ <table class="form-table2" style="margin: 5px; ">
60
+ <?php
61
+ $fv_fp->_get_input_text( array(
62
+ 'key' => array($this->key,'space'),
63
+ 'name' => 'Storage Name',
64
+ 'first_td_class' => 'first'
65
+ ) );
66
+ $fv_fp->_get_input_text( array(
67
+ 'key' => array($this->key,'endpoint'),
68
+ 'name' => 'Endpoint'
69
+ ) );
70
+ $fv_fp->_get_input_text( array(
71
+ 'key' => array($this->key,'key'),
72
+ 'name' => 'Key'
73
+ ) );
74
+ $fv_fp->_get_input_text( array(
75
+ 'key' => array($this->key,'secret'),
76
+ 'name' => 'Secret'
77
+ ) );
78
+ ?>
79
+ <tr>
80
+ <td colspan="4">
81
+ <input type="submit" name="fv-wp-flowplayer-submit" class="button-primary" value="<?php _e('Save All Changes', 'fv-wordpress-flowplayer'); ?>" style="margin-top: 2ex;"/>
82
+ </td>
83
+ </tr>
84
+ </table>
85
+ <?php
86
+ }
87
+
88
+ function secure_link( $url, $secret, $ttl = false ) {
89
+ global $fv_fp;
90
+ $key = $fv_fp->_get_option( array($this->key,'key' ) );
91
+ $secret = $fv_fp->_get_option( array($this->key,'secret' ) );
92
+ $endpoint = $fv_fp->_get_option( array($this->key,'endpoint' ) );
93
+ $endpoint = explode('.',$endpoint);
94
+ $endpoint = $endpoint[0];
95
+
96
+ /*$path = preg_replace( '~.*?//.*?/~', '/', $url );
97
+ $expires = time() + ( $ttl ? $ttl : apply_filters('fv_player_secure_link_timeout', 900) );
98
+ $md5 = base64_encode(md5($path . $secret . $expires, true));
99
+ $md5 = strtr($md5, '+/', '-_');
100
+ $md5 = str_replace('=', '', $md5);
101
+ $url = str_replace( $path, $path."?token=".$md5."&expire=".$expires, $url );*/
102
+
103
+ $time = $ttl ? $ttl : apply_filters('fv_player_secure_link_timeout', 900);
104
+
105
+ $url_components = parse_url($url);
106
+
107
+ $sXAMZDate = gmdate('Ymd\THis\Z');
108
+ $sDate = gmdate('Ymd');
109
+ $sCredentialScope = $sDate."/".$endpoint."/s3/aws4_request"; // todo: variable
110
+ $sSignedHeaders = "host";
111
+ $sXAMZCredential = urlencode( $key.'/'.$sCredentialScope);
112
+
113
+ // 1. http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
114
+ $sCanonicalRequest = "GET\n";
115
+ $sCanonicalRequest .= $url_components['path']."\n";
116
+ $sCanonicalRequest .= "X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=$sXAMZCredential&X-Amz-Date=$sXAMZDate&X-Amz-Expires=$time&X-Amz-SignedHeaders=$sSignedHeaders\n";
117
+ $sCanonicalRequest .= "host:".$url_components['host']."\n";
118
+ $sCanonicalRequest .= "\n$sSignedHeaders\n";
119
+ $sCanonicalRequest .= "UNSIGNED-PAYLOAD";
120
+
121
+ // 2. http://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html
122
+ $sStringToSign = "AWS4-HMAC-SHA256\n";
123
+ $sStringToSign .= "$sXAMZDate\n";
124
+ $sStringToSign .= "$sCredentialScope\n";
125
+ $sStringToSign .= hash('sha256',$sCanonicalRequest);
126
+
127
+ // 3. http://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html
128
+ $sSignature = hash_hmac('sha256', $sDate, "AWS4".$secret, true );
129
+ $sSignature = hash_hmac('sha256', $endpoint, $sSignature, true ); // todo: variable
130
+ $sSignature = hash_hmac('sha256', 's3', $sSignature, true );
131
+ $sSignature = hash_hmac('sha256', 'aws4_request', $sSignature, true );
132
+ $sSignature = hash_hmac('sha256', $sStringToSign, $sSignature );
133
+
134
+ // 4. http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
135
+ $url .= "?X-Amz-Algorithm=AWS4-HMAC-SHA256";
136
+ $url .= "&X-Amz-Credential=$sXAMZCredential";
137
+ $url .= "&X-Amz-Date=$sXAMZDate";
138
+ $url .= "&X-Amz-Expires=$time";
139
+ $url .= "&X-Amz-SignedHeaders=$sSignedHeaders";
140
+ $url .= "&X-Amz-Signature=".$sSignature;
141
+
142
+ return $url;
143
+ }
144
+
145
+ }
146
+
147
+ global $FV_Player_Linode_Object_Storage;
148
+ $FV_Player_Linode_Object_Storage = new FV_Player_Linode_Object_Storage;
149
+
150
+ endif;
models/list-table.php CHANGED
@@ -255,17 +255,16 @@ class FV_Player_List_Table extends WP_List_Table {
255
  }
256
 
257
  public function column_default( $player, $column_name ) {
258
- global $FV_Player_Coconut;
259
-
260
  $id = $player->id;
261
 
 
262
  // if any of the videos for this player contain a coconut_processing_ placeholder,
263
  // try to run Coconut's job check, so we can update that SRC if it was already
264
  // processed
265
- if ( isset( $FV_Player_Coconut ) ) {
266
  foreach ( $player->video_objects as $video_object ) {
267
  if ( strpos( $video_object->getSrc(), 'coconut_processing_' ) !== false ) {
268
- $FV_Player_Coconut->jobs_check();
269
  break;
270
  }
271
  }
255
  }
256
 
257
  public function column_default( $player, $column_name ) {
 
 
258
  $id = $player->id;
259
 
260
+ // TODO: This should be done in a sensible way
261
  // if any of the videos for this player contain a coconut_processing_ placeholder,
262
  // try to run Coconut's job check, so we can update that SRC if it was already
263
  // processed
264
+ if ( function_exists( 'FV_Player_Coconut' ) ) {
265
  foreach ( $player->video_objects as $video_object ) {
266
  if ( strpos( $video_object->getSrc(), 'coconut_processing_' ) !== false ) {
267
+ FV_Player_Coconut()->jobs_check();
268
  break;
269
  }
270
  }
models/media-browser-s3.php CHANGED
@@ -9,14 +9,27 @@ class FV_Player_Media_Browser_S3 extends FV_Player_Media_Browser {
9
  }
10
  }
11
 
12
- function fv_wp_flowplayer_include_aws_sdk() {
13
- if ( ! class_exists( 'Aws\S3\S3Client' ) ) {
14
- require_once( dirname( __FILE__ ) . "/../vendor/autoload.php" );
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
  function get_formatted_assets_data() {
19
- $this->fv_wp_flowplayer_include_aws_sdk();
20
  global $fv_fp, $s3Client;
21
 
22
  $regions = $fv_fp->_get_option('amazon_region');
@@ -79,12 +92,7 @@ class FV_Player_Media_Browser_S3 extends FV_Player_Media_Browser {
79
 
80
  if ($regioned_bucket_found) {
81
 
82
- $output = array(
83
- 'name' => 'Home',
84
- 'type' => 'folder',
85
- 'path' => !empty($_POST['path']) ? $_POST['path'] : 'Home/',
86
- 'items' => array()
87
- );
88
 
89
  $region = $regions[ $array_id ];
90
  $secret = $secrets[ $array_id ];
@@ -142,101 +150,18 @@ class FV_Player_Media_Browser_S3 extends FV_Player_Media_Browser {
142
  ) );
143
 
144
  try {
145
- $args = array(
146
- 'Bucket' => $bucket,
147
- 'Delimiter' => '/',
148
- );
149
-
150
- $request_path = !empty($_POST['path']) ? str_replace( 'Home/', '', stripslashes($_POST['path']) ) : false;
151
-
152
- if( $request_path ) {
153
- $args['Prefix'] = $request_path;
154
- }
155
-
156
- $paged = $s3Client->getPaginator('ListObjects',$args);
157
-
158
- $sum_up = array();
159
-
160
- $date_format = get_option( 'date_format' );
161
- foreach( $paged AS $res ) {
162
-
163
- $folders = !empty($res['CommonPrefixes']) ? $res['CommonPrefixes'] : array();
164
- $files = $res->get('Contents');
165
- if( !$files ) $files = array();
166
-
167
- $objects = array_merge( $folders, $files );
168
-
169
- foreach ( $objects as $object ) {
170
- if ( ! isset( $objectarray ) ) {
171
- $objectarray = array();
172
- }
173
-
174
- $item = array();
175
-
176
- $path = $object['Prefix'] ? $object['Prefix'] : $object['Key'];
177
-
178
- if( !empty($object['Key']) && preg_match( '~\.ts$~', $object['Key'] ) ) {
179
- if( empty($sum_up['ts']) ) $sum_up['ts'] = 0;
180
- $sum_up['ts']++;
181
- continue;
182
- }
183
-
184
- $item['path'] = 'Home/' . $path;
185
-
186
- if( $request_path ) {
187
- if( $request_path == $path ) continue; // sometimes the current folder is present in the response, weird
188
-
189
- $item['name'] = str_replace( $request_path, '', $path );
190
- } else {
191
- $item['name'] = $path;
192
- }
193
-
194
- if( !empty($object['Size']) ) {
195
- $item['type'] = 'file';
196
- $item['size'] = $object['Size'];
197
- $item['modified'] = date($date_format, strtotime($object['LastModified']));
198
 
199
- $link = (string) $s3Client->getObjectUrl( $bucket, $path );
200
- $link = str_replace( '%20', '+', $link );
201
-
202
- // replace link with CloudFront URL, if we have one
203
- if( !empty($domains[$array_id]) ) {
204
- // replace S3 URLs with buckets in the S3 subdomain, like https://fv-flowplayer-cloudfront.s3-us-west-2.amazonaws.com/video.mp4
205
- $link = preg_replace('/https?:\/\/' . $bucket . '\.s3[^.]*\.amazonaws\.com\/(.*)/i', rtrim($domains[$array_id], '/').'/$1', $link);
206
 
207
- // replace S3 URLs with buckets in the S3 subdomain, like https://fv-flowplayer-cloudfront.s3.us-west-2.amazonaws.com/video.mp4
208
- $link = preg_replace('/https?:\/\/' . $bucket . '\.s3\.[^.]*\.amazonaws\.com\/(.*)/i', rtrim($domains[$array_id], '/').'/$1', $link);
209
-
210
- // replace S3 URLs with bucket name as a subfolder
211
- $link = preg_replace('/https?:\/\/[^\/]+\/' . $bucket . '\/(.*)/i', rtrim($domains[$array_id], '/').'/$1', $link);
212
- }
213
 
214
- $item['link'] = $link;
215
-
216
- if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $item['name'])) {
217
- $item['splash'] = apply_filters('fv_flowplayer_splash', $link );
218
- }
219
- } else {
220
- $item['type'] = 'folder';
221
- $item['items'] = array();
222
- }
223
-
224
- $output['items'][] = $item;
225
-
226
- if (strtolower(substr($item['name'], strrpos($item['name'], '.') + 1)) === 'ts') {
227
- continue;
228
- }
229
-
230
- }
231
- }
232
-
233
  foreach( $sum_up AS $ext => $count ) {
234
  $output['items'][] = array(
235
  'name' => '*.ts',
236
  'link' => '',
237
  'size' => $count.' .'.$ext.' files hidden',
238
  'type' => 'placeholder'
239
- );
240
  }
241
 
242
  } catch ( Aws\S3\Exception\S3Exception $e ) {
9
  }
10
  }
11
 
12
+ function decode_link_components( $link ) {
13
+ $link = str_replace( '%20', '+', $link );
14
+
15
+ return $link;
16
+ }
17
+
18
+ function get_custom_domain_url( $link, $bucket, $custom_domain ) {
19
+ // replace S3 URLs with buckets in the S3 subdomain, like https://fv-flowplayer-cloudfront.s3-us-west-2.amazonaws.com/video.mp4
20
+ $link = preg_replace('/https?:\/\/' . $bucket . '\.s3[^.]*\.amazonaws\.com\/(.*)/i', rtrim($custom_domain, '/').'/$1', $link);
21
+
22
+ // replace S3 URLs with buckets in the S3 subdomain, like https://fv-flowplayer-cloudfront.s3.us-west-2.amazonaws.com/video.mp4
23
+ $link = preg_replace('/https?:\/\/' . $bucket . '\.s3\.[^.]*\.amazonaws\.com\/(.*)/i', rtrim($custom_domain, '/').'/$1', $link);
24
+
25
+ // replace S3 URLs with bucket name as a subfolder
26
+ $link = preg_replace('/https?:\/\/[^\/]+\/' . $bucket . '\/(.*)/i', rtrim($custom_domain, '/').'/$1', $link);
27
+
28
+ return $link;
29
  }
30
 
31
  function get_formatted_assets_data() {
32
+ $this->include_aws_sdk();
33
  global $fv_fp, $s3Client;
34
 
35
  $regions = $fv_fp->_get_option('amazon_region');
92
 
93
  if ($regioned_bucket_found) {
94
 
95
+ $output = $this->get_output();
 
 
 
 
 
96
 
97
  $region = $regions[ $array_id ];
98
  $secret = $secrets[ $array_id ];
150
  ) );
151
 
152
  try {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
 
154
+ list( $request_path, $paged, $date_format ) = $this->get_metadata( $s3Client, $bucket );
 
 
 
 
 
 
155
 
156
+ list( $output, $sum_up ) = $this->get_output_items( $output, $s3Client, $request_path, $paged, $date_format, $bucket, array(), $domains[$array_id] );
 
 
 
 
 
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  foreach( $sum_up AS $ext => $count ) {
159
  $output['items'][] = array(
160
  'name' => '*.ts',
161
  'link' => '',
162
  'size' => $count.' .'.$ext.' files hidden',
163
  'type' => 'placeholder'
164
+ );
165
  }
166
 
167
  } catch ( Aws\S3\Exception\S3Exception $e ) {
models/media-browser.php CHANGED
@@ -13,6 +13,7 @@ abstract class FV_Player_Media_Browser {
13
  add_action( 'admin_print_scripts-toplevel_page_fv_player', array($this, 'init_base'), 0 ); // wp-admin -> FV Player
14
  add_action( 'admin_print_scripts-widgets.php', array($this, 'init_base'), 0 ); // wp-admin -> Widgets
15
  add_action( 'admin_print_scripts-fv-player_page_fv_player_coconut', array($this, 'init_base'), 0 ); // wp-admin -> FV Player -> Encode video
 
16
 
17
  // register extending class WP AJAX action
18
  $this->ajax_action_name = $ajax_action_name;
@@ -21,6 +22,12 @@ abstract class FV_Player_Media_Browser {
21
 
22
  abstract function init();
23
 
 
 
 
 
 
 
24
  function init_base() {
25
  global $fv_wp_flowplayer_ver;
26
  wp_enqueue_media();
@@ -37,6 +44,16 @@ abstract class FV_Player_Media_Browser {
37
  add_action( $this->ajax_action_name, array($this, 'load_assets') );
38
  }
39
 
 
 
 
 
 
 
 
 
 
 
40
  function include_s3_upload_assets() {
41
  if ( $this->s3_assets_loaded ) {
42
  return;
@@ -45,8 +62,8 @@ abstract class FV_Player_Media_Browser {
45
  global $fv_wp_flowplayer_ver;
46
 
47
  wp_enqueue_script( 'fv-player-s3-uploader', flowplayer::get_plugin_url().'/js/s3upload.js', array( 'flowplayer-browser-base' ), $fv_wp_flowplayer_ver );
48
- wp_enqueue_style( 'fv-player-s3-uploader-css', flowplayer::get_plugin_url() . '/css/s3-uploader.css', array(), filemtime( dirname(__FILE__).'/../css/s3-uploader.css' ) );
49
  wp_enqueue_script( 'fv-player-s3-uploader-base', flowplayer::get_plugin_url().'/js/s3-upload-base.js', array( 'flowplayer-browser-base' ), $fv_wp_flowplayer_ver );
 
50
 
51
  $this->s3_assets_loaded = true;
52
  }
@@ -55,6 +72,110 @@ abstract class FV_Player_Media_Browser {
55
  return json_decode('{"items":{"name":"Home","type":"folder","path":"Home\/","items":[{"name":"01 The Beginning.mp3","size":2117536,"type":"file","path":"Home\/01 The Beginning.mp3","link":"http:\/\/sjdua7x04ygyx.cloudfront.net\/01%20The%20Beginning.mp3"},{"name":"Fender_Bass_Guitar_Patent.jpg","size":495756,"type":"file","path":"Home\/Fender_Bass_Guitar_Patent.jpg","link":"http:\/\/sjdua7x04ygyx.cloudfront.net\/Fender_Bass_Guitar_Patent.jpg"}]}}', true);
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  function load_assets() {
59
  $json_final = $this->get_formatted_assets_data();
60
 
13
  add_action( 'admin_print_scripts-toplevel_page_fv_player', array($this, 'init_base'), 0 ); // wp-admin -> FV Player
14
  add_action( 'admin_print_scripts-widgets.php', array($this, 'init_base'), 0 ); // wp-admin -> Widgets
15
  add_action( 'admin_print_scripts-fv-player_page_fv_player_coconut', array($this, 'init_base'), 0 ); // wp-admin -> FV Player -> Encode video
16
+ add_action( 'fv_player_media_browser_enqueue_base_uploader_css', array( $this, 'include_base_uploader_css' ) );
17
 
18
  // register extending class WP AJAX action
19
  $this->ajax_action_name = $ajax_action_name;
22
 
23
  abstract function init();
24
 
25
+ // TOTO: should be abstract
26
+ function decode_link_components( $link ) {}
27
+
28
+ // TOTO: should be abstract
29
+ function get_custom_domain_url( $link, $bucket, $custom_domain ) {}
30
+
31
  function init_base() {
32
  global $fv_wp_flowplayer_ver;
33
  wp_enqueue_media();
44
  add_action( $this->ajax_action_name, array($this, 'load_assets') );
45
  }
46
 
47
+ function include_aws_sdk() {
48
+ if ( ! class_exists( 'Aws\S3\S3Client' ) ) {
49
+ require_once( dirname( __FILE__ ) . "/../vendor/autoload.php" );
50
+ }
51
+ }
52
+
53
+ function include_base_uploader_css() {
54
+ wp_enqueue_style( 'fv-player-s3-uploader-css', flowplayer::get_plugin_url() . '/css/s3-uploader.css', array(), filemtime( dirname(__FILE__).'/../css/s3-uploader.css' ) );
55
+ }
56
+
57
  function include_s3_upload_assets() {
58
  if ( $this->s3_assets_loaded ) {
59
  return;
62
  global $fv_wp_flowplayer_ver;
63
 
64
  wp_enqueue_script( 'fv-player-s3-uploader', flowplayer::get_plugin_url().'/js/s3upload.js', array( 'flowplayer-browser-base' ), $fv_wp_flowplayer_ver );
 
65
  wp_enqueue_script( 'fv-player-s3-uploader-base', flowplayer::get_plugin_url().'/js/s3-upload-base.js', array( 'flowplayer-browser-base' ), $fv_wp_flowplayer_ver );
66
+ $this->include_base_uploader_css();
67
 
68
  $this->s3_assets_loaded = true;
69
  }
72
  return json_decode('{"items":{"name":"Home","type":"folder","path":"Home\/","items":[{"name":"01 The Beginning.mp3","size":2117536,"type":"file","path":"Home\/01 The Beginning.mp3","link":"http:\/\/sjdua7x04ygyx.cloudfront.net\/01%20The%20Beginning.mp3"},{"name":"Fender_Bass_Guitar_Patent.jpg","size":495756,"type":"file","path":"Home\/Fender_Bass_Guitar_Patent.jpg","link":"http:\/\/sjdua7x04ygyx.cloudfront.net\/Fender_Bass_Guitar_Patent.jpg"}]}}', true);
73
  }
74
 
75
+ function get_output() {
76
+ $output = array(
77
+ 'name' => 'Home',
78
+ 'type' => 'folder',
79
+ 'path' => !empty($_POST['path']) ? $_POST['path'] : 'Home/',
80
+ 'items' => array()
81
+ );
82
+
83
+ return $output;
84
+ }
85
+
86
+ function get_metadata( $s3Client, $bucket ) {
87
+ $args = array(
88
+ 'Bucket' => $bucket,
89
+ 'Delimiter' => '/',
90
+ );
91
+
92
+ $request_path = !empty($_POST['path']) ? str_replace( 'Home/', '', stripslashes($_POST['path']) ) : false;
93
+
94
+ if( $request_path ) {
95
+ $args['Prefix'] = $request_path;
96
+ }
97
+
98
+ $paged = $s3Client->getPaginator('ListObjects',$args);
99
+
100
+ $date_format = get_option( 'date_format' );
101
+
102
+ return array( $request_path, $paged, $date_format );
103
+ }
104
+
105
+ function get_output_items( $output, $s3Client, $request_path, $paged, $date_format, $bucket, $sum_up = NULL, $custom_domain = NULL ) {
106
+ foreach( $paged AS $res ) {
107
+
108
+ $folders = !empty($res['CommonPrefixes']) ? $res['CommonPrefixes'] : array();
109
+ $files = $res->get('Contents');
110
+ if( !$files ) $files = array();
111
+
112
+ $objects = array_merge( $folders, $files );
113
+
114
+ foreach ( $objects as $object ) {
115
+ if ( ! isset( $objectarray ) ) {
116
+ $objectarray = array();
117
+ }
118
+
119
+ $item = array();
120
+
121
+ $path = $object['Prefix'] ? $object['Prefix'] : $object['Key'];
122
+
123
+ if( isset($sum_up) && !empty($object['Key']) && preg_match( '~\.ts$~', $object['Key'] ) ) {
124
+ if( empty($sum_up['ts']) ) $sum_up['ts'] = 0;
125
+ $sum_up['ts']++;
126
+ continue;
127
+ }
128
+
129
+ $item['path'] = 'Home/' . $path;
130
+
131
+ if( $request_path ) {
132
+ if( $request_path == $path ) continue; // sometimes the current folder is present in the response, weird
133
+
134
+ $item['name'] = str_replace( $request_path, '', $path );
135
+ } else {
136
+ $item['name'] = $path;
137
+ }
138
+
139
+ if( !empty($object['Size']) ) {
140
+ $item['type'] = 'file';
141
+ $item['size'] = $object['Size'];
142
+ $item['modified'] = date($date_format, strtotime($object['LastModified']));
143
+
144
+ if( isset($object['LastModified']) ) {
145
+ $item['LastModified'] = $object['LastModified'];
146
+ }
147
+
148
+ $link = (string) $s3Client->getObjectUrl( $bucket, $path );
149
+
150
+ $link = $this->decode_link_components( $link );
151
+
152
+ // replace link with CloudFront URL, if we have one
153
+ if( !empty($custom_domain) ) {
154
+ $link = $this->get_custom_domain_url($link ,$bucket, $custom_domain);
155
+ }
156
+
157
+ $item['link'] = $link;
158
+
159
+ if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $item['name'])) {
160
+ $item['splash'] = apply_filters('fv_flowplayer_splash', $link );
161
+ }
162
+ } else {
163
+ $item['type'] = 'folder';
164
+ $item['items'] = array();
165
+ }
166
+
167
+ $output['items'][] = $item;
168
+
169
+ if (strtolower(substr($item['name'], strrpos($item['name'], '.') + 1)) === 'ts') {
170
+ continue;
171
+ }
172
+
173
+ }
174
+ }
175
+
176
+ return array( $output, $sum_up );
177
+ }
178
+
179
  function load_assets() {
180
  $json_final = $this->get_formatted_assets_data();
181
 
models/player-position-save.php CHANGED
@@ -10,7 +10,17 @@ class FV_Player_Position_Save {
10
  }
11
 
12
  public static function get_extensionless_file_name($path) {
13
- return pathinfo($path, PATHINFO_FILENAME);
 
 
 
 
 
 
 
 
 
 
14
  }
15
 
16
  public function set_last_position( $aItem, $index, $aArgs ) {
@@ -33,7 +43,7 @@ class FV_Player_Position_Save {
33
  }
34
  }
35
  $try[] = $this->get_extensionless_file_name($aItem['sources'][0]['src']);
36
-
37
  foreach( $try AS $name ) {
38
  if( $metaPosition = get_user_meta( get_current_user_id(), 'fv_wp_flowplayer_position_' . $name, true ) ) {
39
  $aItem['sources'][0]['position'] = intval($metaPosition);
@@ -55,33 +65,56 @@ class FV_Player_Position_Save {
55
  // TODO: XSS filter for POST values?
56
  // check if videoTimes is not a JSON-encoded value, which will happen
57
  // when the request came from a navigation.sendBeacon() call instead of the usual AJAX call
58
- $decoded = json_decode(urldecode($_POST['videoTimes']), true);
59
- if ($decoded !== false) {
60
- $_POST['videoTimes'] = $decoded;
 
 
 
 
 
 
61
  }
62
 
63
- if (is_user_logged_in() && isset($_POST['videoTimes']) && ($times = $_POST['videoTimes']) && count($times)) {
 
 
64
  $uid = get_current_user_id();
65
- foreach ($times as $record) {
66
- $name = $this->get_extensionless_file_name($record['name']);
67
- if( $record['position'] == 0 ) {
68
- delete_user_meta($uid, 'fv_wp_flowplayer_position_'.$name );
69
- } else {
70
- update_user_meta($uid, 'fv_wp_flowplayer_position_'.$name, $record['position']);
 
 
 
 
 
 
 
71
  }
72
 
73
- if( !empty($record['saw']) && $record['saw'] == true ) {
74
- update_user_meta($uid, 'fv_wp_flowplayer_saw_'.$name, true);
 
 
75
  }
 
 
76
  }
77
-
78
- if( !empty($_POST['sawVideo']) && is_array($_POST['sawVideo']) ) {
79
- foreach ($_POST['sawVideo'] as $record) {
80
- update_user_meta($uid, 'fv_wp_flowplayer_saw_'.$this->get_extensionless_file_name($record['name']), true);
81
  }
 
 
 
 
 
 
82
  }
83
-
84
- wp_send_json_success();
85
  } else {
86
  wp_send_json_error();
87
  }
@@ -91,13 +124,32 @@ class FV_Player_Position_Save {
91
  global $fv_fp;
92
  $fv_fp->_get_checkbox(__('Remember video position', 'fv-wordpress-flowplayer'), 'video_position_save_enable', __('Stores the last video play position for users, so they can continue watching from where they left.'), __('It stores in <code>wp_usermeta</code> database table for logged in users and in a localStorage or cookie for guest users.'));
93
  }
94
-
95
  function shortcode( $attributes, $media, $fv_fp ) {
96
  if( !empty($fv_fp->aCurArgs['saveposition']) ) {
97
  $attributes['data-save-position'] = $fv_fp->aCurArgs['saveposition'];
98
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  return $attributes;
100
  }
101
-
102
  }
103
  $FV_Player_Position_Save = new FV_Player_Position_Save();
10
  }
11
 
12
  public static function get_extensionless_file_name($path) {
13
+ $arr = explode('/', $path);
14
+ $video_name = end($arr);
15
+
16
+ // Do not accept HLS playlist file names as these are often index.m3u8 or stream.m3u8
17
+ // Use folder name instead
18
+ if( strpos($video_name, ".m3u8") !== false ) {
19
+ unset($arr[count($arr)-1]);
20
+ $video_name = end($arr);
21
+ }
22
+
23
+ return pathinfo($video_name, PATHINFO_FILENAME);
24
  }
25
 
26
  public function set_last_position( $aItem, $index, $aArgs ) {
43
  }
44
  }
45
  $try[] = $this->get_extensionless_file_name($aItem['sources'][0]['src']);
46
+
47
  foreach( $try AS $name ) {
48
  if( $metaPosition = get_user_meta( get_current_user_id(), 'fv_wp_flowplayer_position_' . $name, true ) ) {
49
  $aItem['sources'][0]['position'] = intval($metaPosition);
65
  // TODO: XSS filter for POST values?
66
  // check if videoTimes is not a JSON-encoded value, which will happen
67
  // when the request came from a navigation.sendBeacon() call instead of the usual AJAX call
68
+ $decoded_times = json_decode(urldecode($_POST['videoTimes']), true);
69
+ $decoded_playlists = json_decode(urldecode($_POST['playlistItems']), true);
70
+
71
+ if ($decoded_times !== false) {
72
+ $_POST['videoTimes'] = $decoded_times;
73
+ }
74
+
75
+ if ($decoded_playlists !== false) {
76
+ $_POST['playlistItems'] = $decoded_playlists;
77
  }
78
 
79
+ $success = false;
80
+
81
+ if ( is_user_logged_in() ) {
82
  $uid = get_current_user_id();
83
+ if (isset($_POST['videoTimes']) && ($times = $_POST['videoTimes']) && count($times)) {
84
+
85
+ foreach ($times as $record) {
86
+ $name = $this->get_extensionless_file_name($record['name']);
87
+ if( intval($record['position']) == 0 ) {
88
+ delete_user_meta($uid, 'fv_wp_flowplayer_position_'.$name );
89
+ } else {
90
+ update_user_meta($uid, 'fv_wp_flowplayer_position_'.$name, $record['position']);
91
+ }
92
+
93
+ if( !empty($record['saw']) && $record['saw'] == true ) {
94
+ update_user_meta($uid, 'fv_wp_flowplayer_saw_'.$name, true);
95
+ }
96
  }
97
 
98
+ if( !empty($_POST['sawVideo']) && is_array($_POST['sawVideo']) ) {
99
+ foreach ($_POST['sawVideo'] as $record) {
100
+ update_user_meta($uid, 'fv_wp_flowplayer_saw_'.$this->get_extensionless_file_name($record['name']), true);
101
+ }
102
  }
103
+
104
+ $success = true;
105
  }
106
+
107
+ if (isset($_POST['playlistItems']) && ($playlistItems = $_POST['playlistItems']) && count($playlistItems)) {
108
+ foreach ($playlistItems as $playeritem) {
109
+ update_user_meta($uid, 'fv_wp_flowplayer_player_playlist_'.$playeritem['player'], $playeritem['item']);
110
  }
111
+
112
+ $success = true;
113
+ }
114
+
115
+ if( $success ) {
116
+ wp_send_json_success();
117
  }
 
 
118
  } else {
119
  wp_send_json_error();
120
  }
124
  global $fv_fp;
125
  $fv_fp->_get_checkbox(__('Remember video position', 'fv-wordpress-flowplayer'), 'video_position_save_enable', __('Stores the last video play position for users, so they can continue watching from where they left.'), __('It stores in <code>wp_usermeta</code> database table for logged in users and in a localStorage or cookie for guest users.'));
126
  }
127
+
128
  function shortcode( $attributes, $media, $fv_fp ) {
129
  if( !empty($fv_fp->aCurArgs['saveposition']) ) {
130
  $attributes['data-save-position'] = $fv_fp->aCurArgs['saveposition'];
131
  }
132
+
133
+ if ( $fv_fp->_get_option('video_position_save_enable') || !empty($fv_fp->aCurArgs['saveposition']) ) {
134
+ $player_id = false;
135
+
136
+ if( $fv_fp->current_player() ) { // db player
137
+ $player_id = $fv_fp->current_player()->getId();
138
+ }
139
+
140
+ if( $player_id ) { // add id to data item if db player
141
+ $attributes['data-player-id'] = $player_id;
142
+
143
+ $metaItem = get_user_meta( get_current_user_id(), 'fv_wp_flowplayer_player_playlist_' . $player_id, true );
144
+
145
+ if ( $metaItem >= 0 ) {
146
+ // playlist item restore
147
+ $attributes['data-playlist_start'] = intval($metaItem) + 1; // playlist-start-position module starts from 0
148
+ }
149
+ }
150
+ }
151
+
152
  return $attributes;
153
  }
 
154
  }
155
  $FV_Player_Position_Save = new FV_Player_Position_Save();
models/system-info.php CHANGED
@@ -100,7 +100,10 @@ PHP Max Input Vars: <?php echo ini_get( 'max_input_vars' ) . "\n"; ?>
100
  PHP Arg Separator: <?php echo ini_get( 'arg_separator.output' ) . "\n"; ?>
101
  PHP Allow URL File Open: <?php echo ini_get( 'allow_url_fopen' ) ? "Yes" : "No\n"; ?>
102
 
103
- WP_DEBUG: <?php echo defined( 'WP_DEBUG' ) ? ( WP_DEBUG ? 'Enabled' . "\n" : 'Disabled' . "\n" ) : 'Not set' . "\n" ?>
 
 
 
104
 
105
  DISPLAY ERRORS: <?php echo ( ini_get( 'display_errors' ) ) ? 'On (' . ini_get( 'display_errors' ) . ')' : 'N/A'; ?><?php echo "\n"; ?>
106
  cURL: <?php echo ( function_exists( 'curl_init' ) ) ? 'Your server supports cURL.' : 'Your server does not support cURL.'; ?><?php echo "\n"; ?>
100
  PHP Arg Separator: <?php echo ini_get( 'arg_separator.output' ) . "\n"; ?>
101
  PHP Allow URL File Open: <?php echo ini_get( 'allow_url_fopen' ) ? "Yes" : "No\n"; ?>
102
 
103
+ PHP Extensions Installed: <?php print_r(get_loaded_extensions()) . "\n"; ?>
104
+ PHP MBString: <?php echo ( extension_loaded('mbstring') ) ? 'MB String extension is installed on server.' : 'MBString extension is not installed on server.'; ?><?php echo "\n"; ?>
105
+
106
+ WP_DEBUG: <?php echo defined( 'WP_DEBUG' ) ? WP_DEBUG ? 'Enabled' . "\n" : 'Disabled' . "\n" : 'Not set' . "\n" ?>
107
 
108
  DISPLAY ERRORS: <?php echo ( ini_get( 'display_errors' ) ) ? 'On (' . ini_get( 'display_errors' ) . ')' : 'N/A'; ?><?php echo "\n"; ?>
109
  cURL: <?php echo ( function_exists( 'curl_init' ) ) ? 'Your server supports cURL.' : 'Your server does not support cURL.'; ?><?php echo "\n"; ?>
models/video-encoder/class.fv-player-encoder-list-table.php ADDED
@@ -0,0 +1,382 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WP_List_Table' ) ) {
4
+ require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
5
+ }
6
+
7
+ class FV_Player_Encoder_List_Table extends WP_List_Table {
8
+
9
+ private
10
+ $args,
11
+ $total_items = 0,
12
+ //$dropdown_cache = false,
13
+ $encoder_id = '',
14
+ $table_name = '';
15
+
16
+ public $base_url;
17
+
18
+ public function __construct( $args = array() ) {
19
+ $this->args = wp_parse_args( $args, array( 'per_page' => 25 ) );
20
+
21
+ if ( empty($args['encoder_id']) ) {
22
+ throw new Exception('Constructor to FV_Player_List_Table is missing "encoder_id" key in its $args array.');
23
+ }
24
+
25
+ if ( empty($args['table_name']) ) {
26
+ throw new Exception('Constructor to FV_Player_List_Table is missing "table_name" key in its $args array.');
27
+ }
28
+
29
+ parent::__construct( array(
30
+ 'singular' => 'Job',
31
+ 'plural' => 'Jobs',
32
+ 'ajax' => false,
33
+ ) );
34
+
35
+ $this->encoder_id = $args['encoder_id'];
36
+ $this->table_name = $args['table_name'];
37
+ $this->get_result_counts();
38
+ $this->process_bulk_action();
39
+ $this->base_url = admin_url( 'admin.php?page=' . $this->encoder_id );
40
+ }
41
+
42
+ public function advanced_filters() {
43
+ ?>
44
+ <style>
45
+ .hover-wrap { position: relative }
46
+ .hover-details {
47
+ position: absolute;
48
+ display: none;
49
+ background: white;
50
+ border: 1px solid lightgray;
51
+ padding: 1em;
52
+ right: 0;
53
+ top: 2em;
54
+ width: 50em;
55
+ z-index: 9;
56
+ }
57
+ pre {
58
+ white-space: pre-wrap; /* css-3 */
59
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
60
+ white-space: -pre-wrap; /* Opera 4-6 */
61
+ white-space: -o-pre-wrap; /* Opera 7 */
62
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
63
+ }
64
+
65
+ .tooltiptext {
66
+ visibility: hidden;
67
+ width: 120px;
68
+ background-color: black;
69
+ color: #fff;
70
+ text-align: center;
71
+ border-radius: 6px;
72
+ padding: 5px 0;
73
+
74
+ /* Position the tooltip */
75
+ position: absolute;
76
+ z-index: 1;
77
+ }
78
+
79
+ .cannot-trash:hover .tooltiptext {
80
+ visibility: visible;
81
+ }
82
+
83
+ .cannot-trash a {
84
+ color: gray;
85
+ cursor: not-allowed;
86
+ }
87
+ </style>
88
+ <?php
89
+ if ( ! empty( $_REQUEST['orderby'] ) )
90
+ echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
91
+ if ( ! empty( $_REQUEST['order'] ) )
92
+ echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
93
+
94
+ if (isset($_GET['id'])) {
95
+ $input_id = $_GET['id'];
96
+ } else {
97
+ $input_id = null;
98
+ }
99
+ ?>
100
+ <p class="search-box">
101
+ <label class="screen-reader-text" for="<?php echo $input_id ?>">Search players:</label>
102
+ <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>" />
103
+ <?php submit_button( "Search players", 'button', false, false, array('ID' => 'search-submit') ); ?><br/>
104
+ </p>
105
+ <?php
106
+ }
107
+
108
+ public function get_sortable_columns() {
109
+ return array(
110
+ 'id' => array( 'id', true ),
111
+ 'date_created' => array( 'date_created', true ),
112
+ // 'player_id' => array( 'player_id', true ),
113
+ 'source' => array( 'source', true ),
114
+ 'target' => array( 'target', true ),
115
+ 'status' => array( 'status', true ),
116
+ 'author' => array( 'author', true )
117
+ );
118
+ }
119
+
120
+ protected function get_primary_column_name() {
121
+ return 'id';
122
+ }
123
+
124
+ /*function get_user_dropdown( $user_id, $name = false, $disabled = false ) {
125
+ if( !$this->dropdown_cache ) {
126
+ $this->dropdown_cache = wp_dropdown_users( array(
127
+ 'name' => 'user_id',
128
+ 'role__not_in' => array('subscriber'),
129
+ 'show_option_none' => 'All users',
130
+ 'echo' => false
131
+ ) );
132
+ }
133
+ $html = $this->dropdown_cache;
134
+
135
+ $html = str_replace("value='".$user_id."'>","value='".$user_id."' selected>",$html);
136
+ if( $name ) $html = str_replace("name='user_id' ","name='".$name."' ' ",$html);
137
+ if( $disabled ) $html = str_replace("<select ","<select disabled='disabled' ",$html);
138
+
139
+ return $html;
140
+ }*/
141
+
142
+ public function column_cb( $player ) {
143
+ return sprintf(
144
+ '<input type="checkbox" name="%1$s[]" value="%2$s" />',
145
+ 'log_id',
146
+ $player->id
147
+ );
148
+ }
149
+
150
+ public function column_default( $job, $column_name ) {
151
+ switch ( $column_name ) {
152
+ case 'id' :
153
+ $value = '<a href="#"">'.$job->id.'</a>';
154
+ if( isset($job->delete_confirmation_message) && !isset( $job->player_id ) ) { // show delete only id not in player
155
+ $value .='<div class="row-actions"><span class="trash"><a href="#" class="job-delete delete-hover" data-message="'. $job->delete_confirmation_message .'" data-nonce="'.wp_create_nonce( 'fv-player-encoder-delete-job-'.$job->id ).'" data-id="'.$job->id.'">Delete</a></span></div>';
156
+ } else {
157
+ $value .= '<div class="row-actions"><span class="cannot-trash"><a class="delete-hover">Delete</a><span class="tooltiptext">Cannot delete the job because video is embeded in player</span></div>';
158
+ }
159
+ break;
160
+ case 'date_created' :
161
+ $value = $job->date_created > 0 ? "<abbr title='$job->date_created'>".date('Y/m/d',strtotime($job->date_created))."</abbr>" : false;
162
+ break;
163
+ case 'source':
164
+ $nice_src = preg_replace( '~\?.+$~', '', $job->$column_name );
165
+ $value = "<a href='".esc_attr($job->$column_name)."' target='_blank'>".$nice_src."</a>";
166
+ break;
167
+ case 'status':
168
+ $error = !empty($job->error) ? "<p><b>".$job->error."</b></p>" : "";
169
+ $value = "<div class='hover-wrap'><a href='#'>".$job->status. ( $job->status == 'processing' ? " " . $job->progress : "" ) ."</a>";
170
+ if( $job->status == 'processing' ) {
171
+ $value .= ' <img data-fv-player-wizard-indicator width="16" height="16" src="'.site_url('wp-includes/images/wpspin-2x.gif').'" />';
172
+ }
173
+ $value .= "<div class='hover-details'>".$error."<h4>Response:</h4><pre>".self::json_prettyPrint($job->result)."</pre><h4>Output:</h4><pre>".self::json_prettyPrint($job->output)."</pre></div></div>";
174
+ break;
175
+ case 'target':
176
+ $value = "<div class='hover-wrap'><a href='#'>".$job->target."</a><div class='hover-details'><pre>" . $this->json_prettyPrint( $job->args ) . "</pre></div></div>";
177
+ break;
178
+ case 'author':
179
+ $value = '<a href="#">'.get_the_author_meta( 'user_nicename' , $job->author ).'</a>';
180
+ break;
181
+ default:
182
+ $value = isset($job->$column_name) && $job->$column_name ? $job->$column_name : '';
183
+ break;
184
+ }
185
+
186
+ return $value;
187
+ }
188
+
189
+ private function json_prettyPrint( $json ) {
190
+ $result = '';
191
+ $level = 0;
192
+ $in_quotes = false;
193
+ $in_escape = false;
194
+ $ends_line_level = NULL;
195
+ $json_length = strlen( $json );
196
+
197
+ for( $i = 0; $i < $json_length; $i++ ) {
198
+ $char = $json[$i];
199
+ $new_line_level = NULL;
200
+ $post = "";
201
+ if( $ends_line_level !== NULL ) {
202
+ $new_line_level = $ends_line_level;
203
+ $ends_line_level = NULL;
204
+ }
205
+ if ( $in_escape ) {
206
+ $in_escape = false;
207
+ } else if( $char === '"' ) {
208
+ $in_quotes = !$in_quotes;
209
+ } else if( ! $in_quotes ) {
210
+ switch( $char ) {
211
+ case '}': case ']':
212
+ $level--;
213
+ $ends_line_level = NULL;
214
+ $new_line_level = $level;
215
+ break;
216
+
217
+ case '{': case '[':
218
+ $level++;
219
+ case ',':
220
+ $ends_line_level = $level;
221
+ break;
222
+
223
+ case ':':
224
+ $post = " ";
225
+ break;
226
+
227
+ case " ": case "\t": case "\n": case "\r":
228
+ $char = "";
229
+ $ends_line_level = $new_line_level;
230
+ $new_line_level = NULL;
231
+ break;
232
+ }
233
+ } else if ( $char === '\\' ) {
234
+ $in_escape = true;
235
+ }
236
+ if( $new_line_level !== NULL ) {
237
+ $result .= "\n".str_repeat( " ", $new_line_level );
238
+ }
239
+ $result .= $char.$post;
240
+ }
241
+
242
+ return $result;
243
+ }
244
+
245
+ public function get_bulk_actions() { // todo: any bulk action?
246
+ return array();
247
+ }
248
+
249
+ public function process_bulk_action() { // todo: any bulk action?
250
+ return;
251
+ }
252
+
253
+ private function get_result_counts() {
254
+ global $wpdb;
255
+ $this->total_items = $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->table_name );
256
+ }
257
+
258
+ public function get_columns() {
259
+ return array(
260
+ 'id' => __( 'ID' ),
261
+ 'date_created' => __( 'Created' ),
262
+ 'source' => __( 'Source' ),
263
+ 'target' => __( 'Target' ),
264
+ 'status' => __( 'Status' ),
265
+ 'author' => __( 'Author' ),
266
+ 'player_id' => __( 'Player ID' )
267
+ );
268
+ }
269
+
270
+ private function get_data($id = false, $args = false ) {
271
+ if( !$args ) $args = $_GET;
272
+
273
+ $args = wp_parse_args( $args, array(
274
+ 'exclude' => false,
275
+ 'order' => 'desc',
276
+ 'orderby' => 'date_created',
277
+ 'paged' => 1,
278
+ 'status' => false,
279
+ 's' => false
280
+ ));
281
+
282
+ $aWhere = array();
283
+ $aWhere[] = "type = '{$this->encoder_id}'";
284
+
285
+ if( is_array($id) ) {
286
+ $id = array_map('intval', $id);
287
+ $aWhere[] = 'id IN ('.implode(',',$id).')';
288
+ } else if( $id ) {
289
+ $aWhere[] = 'id = '.intval($id);
290
+ }
291
+
292
+ if( $args['exclude'] ) {
293
+ $aWhere[] = 'id NOT IN ('.implode(',',$args['exclude']).')';
294
+ }
295
+
296
+ if( $args['status'] == 'pending' ) $aWhere[] = "status = 'pending'";
297
+ if( $args['status'] == 'complete' ) $aWhere[] = "status = 'complete'";
298
+ if( $args['status'] == 'error' ) $aWhere[] = "status = 'error'";
299
+
300
+ if( $args['s'] ) {
301
+ // TODO: Search SQL
302
+ }
303
+
304
+ $where = count($aWhere) ? " WHERE ".implode( " AND ", $aWhere ) : "";
305
+
306
+ $order = esc_sql($args['order']);
307
+ $order_by = esc_sql($args['orderby']);
308
+
309
+ $per_page = intval($this->args['per_page']);
310
+ $offset = ( $args['paged'] - 1 ) * $per_page;
311
+
312
+ global $wpdb;
313
+ $sql = "SELECT * FROM {$this->table_name} $where ORDER BY $order_by $order LIMIT $offset, $per_page";
314
+
315
+ // get embeded players using id from job
316
+ $sql_2 = "SELECT j.id, m.id_video, p.id AS player_id FROM {$this->table_name} AS j
317
+ JOIN `{$wpdb->prefix}fv_player_videometa` AS m ON j.id = m.meta_value
318
+ JOIN `{$wpdb->prefix}fv_player_players` AS p ON find_in_set(p.videos,m.id_video) > 0
319
+ WHERE m.meta_key = 'encoding_job_id'";
320
+ //echo "<pre>".$sql."</pre>";
321
+
322
+ $results = $wpdb->get_results($sql);
323
+
324
+ $playlist_embed = $wpdb->get_results($sql_2);
325
+
326
+ // add player id(s) to results
327
+ foreach( $results AS $key => $row ) {
328
+ foreach ( $playlist_embed as $key2 => $row2 ) {
329
+ if( $row->id == $row2->id ) {
330
+ if( !isset($results[$key]->player_id) ) {
331
+ $results[$key]->player_id = "". $row2->player_id;
332
+ } else {
333
+ $results[$key]->player_id .= ",". $row2->player_id;
334
+ }
335
+ }
336
+ }
337
+
338
+ $args = json_decode($row->args ,true);
339
+
340
+ $message = array();
341
+
342
+ // Get target, host & bucket for message when deleting job
343
+ if( !empty($args['storage']['endpoint']) ) {
344
+ $message[] = 'Host: ' .$args['storage']['endpoint'];
345
+ }
346
+
347
+ if( !empty($args['storage']['bucket']) ) {
348
+ $message[] = 'Space/Bucket: ' .$args['storage']['bucket'];
349
+ }
350
+
351
+ if( isset($args['outputs']['httpstream']) ) {
352
+ $message[] = 'Folder: ' .$args['outputs']['httpstream']['hls']['path'];
353
+ } else if ( isset($args['outputs']['httpstream#above4k']) ) {
354
+ $message[] = 'Folder: ' .$args['outputs']['httpstream#above4k']['hls']['path'];
355
+ }
356
+
357
+ if( count( $message ) ) {
358
+ $results[$key]->delete_confirmation_message = "\n\n".implode( "\n\n", $message );
359
+ }
360
+
361
+ }
362
+
363
+ return $results;
364
+ }
365
+
366
+ public function prepare_items( $id = false, $args = false ) {
367
+ $columns = $this->get_columns();
368
+ $hidden = array(); // No hidden columns
369
+ $sortable = $this->get_sortable_columns();
370
+ $this->items = $this->get_data( $id, $args );
371
+
372
+ $this->_column_headers = array( $columns, $hidden, $sortable );
373
+
374
+ $this->set_pagination_args( array(
375
+ 'total_items' => $this->total_items,
376
+ 'per_page' => $this->args['per_page'],
377
+ 'total_pages' => ceil( $this->total_item / $this->args['per_page'] ),
378
+ )
379
+ );
380
+ }
381
+
382
+ }
models/video-encoder/video-encoder.php ADDED
@@ -0,0 +1,1016 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ abstract class FV_Player_Video_Encoder {
4
+ private
5
+ $encoder_id = '', // used for unique action names and asset names (CSS, JS)
6
+ // examples: coconut, bunny_stream, dos ...
7
+ $encoder_wp_url_slug = '', // used in all links that will point to the list of this encoder jobs
8
+ // examples: fv_player_coconut, fv_player_bunny_stream ...
9
+ $encoder_name = '', // used to display name of the service where appropriate (mostly information DIVs in a HTML output)
10
+ // examples: Coconut, Bunny.net Stream ...
11
+ $instance = null, // self-explanatory
12
+ $admin_page = false, // will be set to a real admin submenu page object once created
13
+ $browser_inc_file = ''; // the full inclusion path for this Encoder's browser PHP backend file, so we can include_once() it
14
+
15
+ // variables to override or access from outside of the base class
16
+ protected
17
+ $version = 'latest',
18
+ $license_key = false,
19
+ $table_name = 'fv_player_encoding_jobs'; // table in which encoding jobs are stored
20
+
21
+ public function _get_instance() {
22
+ return $this->instance;
23
+ }
24
+
25
+ public function get_version() {
26
+ return $this->version;
27
+ }
28
+
29
+ public function get_table_name() {
30
+ return $this->table_name;
31
+ }
32
+
33
+ protected function __construct( $encoder_id, $encoder_name, $encoder_wp_url_slug, $browser_inc_file ) {
34
+ global $wpdb;
35
+
36
+ if ( !$encoder_id ) {
37
+ throw new Exception('Extending encoder class did not provide an encoder ID!');
38
+ }
39
+
40
+ if ( !$encoder_name ) {
41
+ throw new Exception('Extending encoder class did not provide an encoder name!');
42
+ }
43
+
44
+ if ( !$encoder_wp_url_slug ) {
45
+ throw new Exception('Extending encoder class did not provide an encoder URL slug!');
46
+ }
47
+
48
+ if ( !$browser_inc_file ) {
49
+ throw new Exception('Extending encoder class did not provide a browser backend PHP file name!');
50
+ }
51
+
52
+ $this->encoder_id = $encoder_id;
53
+ $this->encoder_name = $encoder_name;
54
+ $this->encoder_wp_url_slug = $encoder_wp_url_slug;
55
+
56
+ // table names always start on WP prefix, so add that here for our table name here
57
+ $this->table_name = $wpdb->prefix . $this->table_name;
58
+ $this->browser_inc_file = $browser_inc_file;
59
+
60
+ add_action('init', array( $this, 'email_notification' ), 7 );
61
+
62
+ if( is_admin() ) {
63
+ add_action( 'admin_menu', array($this, 'admin_menu'), 11 );
64
+
65
+ add_filter( 'fv_player_conf_defaults', array( $this, 'default_settings' ), 10, 2 );
66
+
67
+ $version = get_option( 'fv_player_' . $this->encoder_id . '_ver' );
68
+ if( $this->version != $version ) {
69
+ update_option( 'fv_player_' . $this->encoder_id . '_ver', $this->version );
70
+
71
+ // This is where FV Player will set any default settings.
72
+ // We have to do this again as we only init this plugin on plugins_loaded after $fv_fp has been created with the default settings initialized.
73
+ global $fv_fp;
74
+ if( !empty($fv_fp) && method_exists( $fv_fp, '_get_conf' ) ) {
75
+ $fv_fp->_get_conf();
76
+ }
77
+
78
+ $this->plugin_update_database();
79
+ }
80
+
81
+ add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
82
+
83
+ add_action( 'wp_ajax_fv_player_' . $this->encoder_id .'_submit', array( $this, 'ajax_fv_player_job_submit') );
84
+
85
+ add_action( 'wp_ajax_fv_player_' . $this->encoder_id .'_delete_job', array( $this, 'ajax_fv_player_delete_job') );
86
+
87
+ //add_action( 'plugins_loaded', array( $this, 'init_browser') );
88
+ // this file is actually only included after the 'plugins_loaded' action was fired, so let's run this method manually
89
+ $this->init_browser();
90
+
91
+ // we use a custom taxonomy to categorize the jobs
92
+ add_action( 'admin_init', array( $this, 'create_encoding_categories' ) );
93
+
94
+ // when a new encoding category gets added, we don't want it to show on top of the list
95
+ add_filter( 'wp_terms_checklist_args', array( $this, 'category_picker_args' ) );
96
+
97
+ // Periodically update jobs status when wp hearbeat is fired
98
+ add_filter( 'heartbeat_received', array( $this, 'heartbeat_check' ), 10, 3 );
99
+
100
+ // Editor enhancements to store job ID with video
101
+ add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_editor_scripts'));
102
+ add_action( 'fv_flowplayer_shortcode_editor_item_after', array( $this, 'shortcode_editor_item' ) );
103
+
104
+ add_filter('plugin_action_links', array( $this, 'admin_plugin_action_links' ), 10, 2);
105
+
106
+ $options = get_option( 'fvwpflowplayer' );
107
+ if( !empty($options[ $this->encoder_id ]) && !empty($options[ $this->encoder_id ]['license_key']) ) {
108
+ $this->license_key = $options[ $this->encoder_id ]['license_key'];
109
+ }
110
+
111
+ add_action( 'admin_notices', array( $this, 'admin_notices' ) );
112
+
113
+ add_action( 'fv_player_video_encoder_include_listing_lib', array( $this, 'include_listing_lib' ), 10, 0 );
114
+ }
115
+
116
+ add_action( 'fv_player_item', array( $this, 'check_playlist_video_is_processing' ) );
117
+ }
118
+
119
+ /**
120
+ * Includes a generic jobs listing library, so it can be used outside of this class,
121
+ * i.e. by extending Encoder classes, when needed.
122
+ */
123
+ public function include_listing_lib() {
124
+ require_once dirname( __FILE__ ) . '/class.fv-player-encoder-list-table.php';
125
+ }
126
+
127
+ /**
128
+ * Checks whether the video is being processed by the extending Encoder
129
+ * and if so, includes JS & CSS for that Encoder (+ global overlay CSS) on page, so the extending class
130
+ * can display overlays with error / progress messages.
131
+ *
132
+ * @param $item array The actual video item to check.
133
+ *
134
+ * @return array Returns an augmented video item data, if its source was found to be a video in encoding process.
135
+ */
136
+ public function check_playlist_video_is_processing( $item ) {
137
+ if ( is_array($item['sources']) ) {
138
+ foreach( $item['sources'] as $source ) {
139
+ if ( strpos($source['src'], $this->encoder_id . '_processing_' ) !== false ) {
140
+ $item['pending_encoding'] = true;
141
+
142
+ $job_id = explode( $this->encoder_id. '_processing_', $source['src'] );
143
+ if( !empty($job_id[1]) ) {
144
+ $job_id = $job_id[1];
145
+
146
+ $check = $this->update_temporary_job_src( false, $job_id );
147
+ if( !empty($check['progress']) && ( $check['status'] != 'error' ) ) {
148
+ $item['pending_encoding_progress'] = $check['progress'];
149
+ } else {
150
+ $item['pending_encoding_error'] = true;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ return $item;
158
+ }
159
+
160
+ /**
161
+ * Enqueues a JS file for shortcode editor when needed on the backend pages.
162
+ *
163
+ * @param $page The identifier of a page we're currently viewing.
164
+ */
165
+ public function admin_enqueue_editor_scripts($page) {
166
+ if( $page == 'post.php' || $page == 'post-new.php' || $page == 'toplevel_page_fv_player' ) {
167
+ wp_enqueue_script('fvplayer-shortcode-editor-' . $this->encoder_id, plugins_url( 'js/shortcode-editor.js', $this->getFILE() ), array('jquery', 'fvwpflowplayer-shortcode-editor'), $this->version );
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Periodically updates jobs status when wp hearbeat is fired.
173
+ *
174
+ * @param $response array The heartbeat response body which we're augmenting with our job data.
175
+ * @param $data array containing IDs of jobs pending encoding for the current extending Encoder class.
176
+ * @param $screen_id string ID of the page we're currently viewing.
177
+ *
178
+ * @return mixed
179
+ */
180
+ public function heartbeat_check( $response, $data, $screen_id ) {
181
+ if( strcmp( 'fv-player_page_' . $this->encoder_wp_url_slug, $screen_id ) == 0 ) {
182
+ if( isset($data[ $this->encoder_id . '_pending' ]) ) {
183
+ $ids = $data[ $this->encoder_id . '_pending' ];
184
+ $response[ $this->encoder_id . '_still_pending'] = $this->jobs_check(true); // update pending job in js
185
+ $rows_html = $this->get_updated_rows( $ids );
186
+ $response[ $this->encoder_id ] = $rows_html; // html for jobs
187
+ }
188
+ }
189
+
190
+ return $response;
191
+ }
192
+
193
+ /**
194
+ * Returns augmented arguments array for the category picker with the option for "checked_ontop" set to FALSE.
195
+ *
196
+ * @param $args The original arguments array for the category picker.
197
+ *
198
+ * @return array Returns augmented arguments array for the category picker with the option for "checked_ontop" set to FALSE.
199
+ */
200
+ function category_picker_args( $args ) {
201
+ if( !empty($_POST['action']) && strcmp($_POST['action'],'add-fv_player_encoding_category') == 0 ) {
202
+ $args['checked_ontop'] = false;
203
+ }
204
+ return $args;
205
+ }
206
+
207
+ /**
208
+ * Creates encoding categories taxonomy.
209
+ */
210
+ function create_encoding_categories() {
211
+ register_taxonomy(
212
+ 'fv_player_encoding_category',
213
+ 'fv_player_encoding_job',
214
+ array(
215
+ 'hierarchical' => true,
216
+ 'rewrite' => false // we only need the category names
217
+ )
218
+ );
219
+ }
220
+
221
+ /**
222
+ * Adds FV Player admin menu item to show jobs for this Encoder.
223
+ */
224
+ function admin_menu(){
225
+ if( current_user_can('edit_posts') ) {
226
+
227
+ $title = $this->encoder_name . ( $this->is_configured() ? ' Jobs' : '' );
228
+
229
+ $this->admin_page = add_submenu_page( 'fv_player', $title, $title, 'edit_posts', $this->encoder_wp_url_slug, array( $this, 'tools_panel' ) );
230
+
231
+ if( $this->is_configured() ) {
232
+ add_action( 'load-'.$this->admin_page, array( $this, 'screen_options' ) );
233
+ //add_filter( 'manage_toplevel_page_fv_player_columns', array( $this, 'screen_columns' ) );
234
+ //add_filter( 'hidden_columns', array( $this, 'screen_columns_hidden' ), 10, 3 );
235
+ add_filter( 'set-screen-option', array($this, 'set_screen_option'), 10, 3);
236
+ }
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Adds Settings or Finish Set-Up tab links on top of the Encoder's jobs listing page.
242
+ *
243
+ * @param $links array An array of existing tab links.
244
+ * @param $file string Filename in which we're calling this action.
245
+ *
246
+ * @return array Returns an array with new tab links added to it.
247
+ */
248
+ function admin_plugin_action_links($links, $file) {
249
+ if ( stripos( $file, 'fv-player-' . $this->encoder_id . '.php') !== false ) {
250
+ if ( $this->is_configured() ) {
251
+ $extra_link = '<a href="'.admin_url('admin.php?page=' . $this->encoder_wp_url_slug . '&panel=settings').'">Settings</a>';
252
+ } else {
253
+ $extra_link = '<a href="'.admin_url('admin.php?page=' . $this->encoder_wp_url_slug).'">Finish Set-Up</a>';
254
+ }
255
+ array_unshift($links, $extra_link);
256
+ }
257
+ return $links;
258
+ }
259
+
260
+ /**
261
+ * Ajax handler for deleting completed and errorred-out jobs
262
+ *
263
+ * @param int $_POST['id_row'] ID of the job row
264
+ *
265
+ * @return JSON Status message
266
+ */
267
+ function ajax_fv_player_delete_job() {
268
+ global $wpdb;
269
+
270
+ $id = $_POST['id_row'];
271
+
272
+ if (
273
+ defined('DOING_AJAX') &&
274
+ ( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'fv-player-encoder-delete-job-' . $id ) )
275
+ ) {
276
+ wp_send_json( array('error' => 'Bad nonce') );
277
+ }
278
+
279
+ if ( $wpdb->query( $wpdb->prepare("DELETE FROM " . $this->table_name . " WHERE id = %d ", $id) ) ) {
280
+ wp_send_json( array('success' => 'Job deleted successfully') );
281
+ } else {
282
+ wp_send_json( array('error' => 'Error deleting row') );
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Ajax handler for creation of new job.
288
+ *
289
+ * @param string $_POST['source'] Source file URL
290
+ * @param string $_POST['target'] Target folder on the target CDN
291
+ * @param string $_POST['encryption'] Should it encrypt the video?
292
+ *
293
+ * @return JSON New job table row HTML in html property and also error property if there is any error
294
+ */
295
+ function ajax_fv_player_job_submit() {
296
+ global $wpdb;
297
+
298
+ // TODO: update JS to generate correct nonce ID (it was coconut_expert_nonce before)
299
+ if(
300
+ defined('DOING_AJAX') &&
301
+ ( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'fv_player_' . $this->encoder_id ) )
302
+ ) {
303
+ wp_send_json( array('error' => 'Bad nonce') );
304
+ }
305
+
306
+ $source = trim( $_POST['source'] );
307
+ $target = trim( $_POST['target'] );
308
+
309
+ // if the extending Encoder supports encryption, add it here
310
+ if ( isset($_POST['encryption']) ) {
311
+ $encryption = $_POST['encryption'];
312
+ }
313
+
314
+ // if the extending Encoder supports a trailer, add it here
315
+ if ( isset( $_POST['trailer'] ) ) {
316
+ $trailer = $_POST['trailer'];
317
+ }
318
+
319
+ // if we get a proper category link, we prepend its Name (and parent Names) to the target
320
+ if ( !empty($_POST['category_id']) ) {
321
+ if ( $folder = $this->util__category_id_to_folder( $_POST['category_id'] ) ) {
322
+ $target = $folder.'/'.$target;
323
+ }
324
+ }
325
+
326
+ $target = $this->util__sanitize_target($target);
327
+
328
+ // check for a valid source URL
329
+ if ( empty( $_POST['no_source_verify'] ) && !preg_match('~^(https?|s?ftp)://~', $source) ) {
330
+ $error = 'Your source location is not a proper URL!';
331
+ if ( defined('DOING_AJAX') ) {
332
+ wp_send_json( array('error' => $error) );
333
+ } else {
334
+ return $error;
335
+ }
336
+ }
337
+
338
+ // if the same target name already exists and we've not asked to rename it automatically,
339
+ // return an error
340
+ if ( empty( $_POST['rename_if_exists'] ) && empty( $_POST['ignore_duplicates'] ) ) {
341
+ if ( $wpdb->get_var( $wpdb->prepare( "SELECT count(id) FROM " . $this->table_name . " WHERE target = %s AND status != 'error' ", $target ) ) ) {
342
+ $error = 'Target stream already exists, please try with different target name.';
343
+ if ( defined( 'DOING_AJAX' ) ) {
344
+ wp_send_json( array( 'error' => $error ) );
345
+ } else {
346
+ return $error;
347
+ }
348
+ }
349
+ } else if ( empty( $_POST['ignore_duplicates'] ) ) {
350
+ $original_target = $target;
351
+ $rename_suffix_counter = 1;
352
+ while ( $wpdb->get_var( $wpdb->prepare( "SELECT count(id) FROM " . $this->table_name . " WHERE target = %s AND status != 'error' ", $target ) ) ) {
353
+ $rename_suffix_counter++;
354
+ $target = $original_target . '_' . $rename_suffix_counter;
355
+ }
356
+ }
357
+
358
+ // verify the currently used endpoint supported by the extending Encoder,
359
+ // such as (S)FTP or S3 credentials
360
+ $endpoint_verify = $this->verify_active_endpoint( $target );
361
+ if ( $endpoint_verify !== true ) {
362
+ return $endpoint_verify;
363
+ }
364
+
365
+ // prepare an encoding job to submit to the extending Encoder
366
+ $job = array(
367
+ 'source' => $source,
368
+ 'target' => $target,
369
+ );
370
+
371
+ // encryption support
372
+ if ( isset( $encryption ) ) {
373
+ $job['encryption'] = $encryption;
374
+ }
375
+
376
+ // support for trailers
377
+ if ( isset( $trailer ) ) {
378
+ $job['trailer'] = $trailer;
379
+ }
380
+
381
+ // create a new job
382
+ $id = $this->job_create( $job );
383
+ $show = array( $id );
384
+
385
+ // submit the job to the Encoder service
386
+ $result = $this->job_submit($id);
387
+
388
+ if( defined('DOING_AJAX') ) {
389
+ require_once dirname( __FILE__ ) . '/class.fv-player-encoder-list-table.php';
390
+
391
+ ob_start();
392
+ $jobs_table = new FV_Player_Encoder_List_Table( array( 'encoder_id' => $this->encoder_id, 'table_name' => $this->table_name ) );
393
+ $jobs_table->prepare_items($show);
394
+ $jobs_table->display();
395
+ $html = ob_get_clean();
396
+
397
+ wp_send_json( array( 'html' => $html, 'id' => $id, 'result' => $result ) );
398
+
399
+ } else {
400
+ return $id;
401
+ }
402
+ }
403
+
404
+ /**
405
+ * Includes the browser PHP backend file for the extending encoder class.
406
+ */
407
+ function init_browser() {
408
+ // it should not show when picking the media file in dashboard
409
+ if( empty( $_GET['page'] ) || strcmp( $_GET['page'], $this->encoder_wp_url_slug ) != 0 ) {
410
+ include_once( $this->browser_inc_file );
411
+ }
412
+ }
413
+
414
+ /**
415
+ * Returns an array with all updated jobs' HTML that can be used on admin pages
416
+ * to refresh jobs table data during the WP heartbeat.
417
+ *
418
+ * @param $ids array An array of all job IDs to get HTML output for.
419
+ *
420
+ * @return array Returns an array with all updated jobs' HTML that can be used on admin pages
421
+ * to refresh jobs table data during the WP heartbeat.
422
+ */
423
+ function get_updated_rows( $ids ) {
424
+ $rows = array();
425
+
426
+ if( count($ids) > 0 ) {
427
+ require_once dirname( __FILE__ ) . '/class.fv-player-encoder-list-table.php';
428
+ // get html for processed rows
429
+ foreach($ids as $id ) {
430
+ ob_start();
431
+ $jobs_table = new FV_Player_Encoder_List_Table( array( 'encoder_id' => $this->encoder_id, 'table_name' => $this->table_name ) );
432
+ $jobs_table->prepare_items( array($id) );
433
+ $jobs_table->display();
434
+ $html = ob_get_clean();
435
+ preg_match( '/<tbody[\s\S]*?(<tr>[\s\S]*?<\/tr>)[\s\S]*?<\/tbody>/', $html, $matches ); // match row
436
+
437
+ $rows[$id] = $matches[1];
438
+ }
439
+ }
440
+
441
+ return( $rows );
442
+ }
443
+
444
+ /**
445
+ * Checks pending encoder jobs for status change and update the src
446
+ * of this file everywhere it's used in players.
447
+ *
448
+ * @param false $all If true, all records are retrieved, otherwise only records for the last 30 seconds are selected.
449
+ *
450
+ * @return array Returns an array of all IDs that were in processing status and checked for status change.
451
+ */
452
+ function jobs_check( $all = false ) {
453
+ global $wpdb;
454
+
455
+ $ids = array();
456
+ $pending_jobs = $wpdb->get_results( "SELECT * FROM ". $this->table_name . " WHERE type = '{$this->encoder_id}' AND status = 'processing'" . ( $all ? '' : ' AND date_checked < DATE_SUB( UTC_TIMESTAMP(), INTERVAL 30 SECOND )' ) );
457
+
458
+ foreach( $pending_jobs AS $pending_job ) {
459
+ $ids[] = $pending_job->id;
460
+
461
+ $check_result = $this->job_check( $pending_job );
462
+
463
+ // if this job was completed, update SRC of all players where its temporary placeholder is used
464
+ if ( $check_result['status'] == 'completed' ) {
465
+ $this->update_temporary_job_src( $check_result, $pending_job->id );
466
+ }
467
+ }
468
+
469
+ return $ids;
470
+ }
471
+
472
+ /**
473
+ * Updates src of all videos where the temporary "encoder_processing_" placeholder was used
474
+ * for the video given either by the $check_result parameter or the one currently displayed on page.
475
+ *
476
+ * @param array $check_result If set, this will be a previous job check result from this encoder.
477
+ * @param int $job_id If set, this will be a previous job ID for which the $check_result check was made.
478
+ *
479
+ * @return array|null Returns job check value which will be either the same as the given $check_result
480
+ * or a new, real $check_result after a job check.
481
+ */
482
+ private function update_temporary_job_src( $check_result = null, $job_id = null ) {
483
+ global $FV_Player_Db, $fv_fp;
484
+
485
+ if ( $check_result ) {
486
+ $check = $check_result;
487
+ } else if ( $fv_fp->current_video() ) {
488
+ $check = $this->job_check( (int) substr( $fv_fp->current_video()->getSrc(), strlen( $this->encoder_id . '_processing_' ) ) );
489
+ } else {
490
+ user_error('Could not retrieve JOB check for encoder ' . $this->encoder_name . ', job ID: ' . $job_id . ', defaulted back to input value: ' . print_r( $check_result, true ), E_USER_WARNING );
491
+ return $check_result;
492
+ }
493
+
494
+ if ( $check['status'] == 'completed' ) {
495
+ // if we don't have current_video then we're on the players listing page, so we need to find and update
496
+ // all players where our temporary "encoder_processing_" placeholder is used
497
+ if ( !$fv_fp->current_video() ) {
498
+ while ( $vid = $FV_Player_Db->get_video_by_src( $this->encoder_id . '_processing_' . (int) $job_id ) ) {
499
+ // video processed, replace its SRC
500
+ $vid->set( 'src', $check['output']->src[0] );
501
+
502
+ // also replace its thumbnail / splash
503
+ if ( $check['output']->thumbnail ) {
504
+ $vid->set( 'splash', $check['output']->thumbnail );
505
+ } else if ( $check['output']->splash ) {
506
+ $vid->set( 'splash', $check['output']->splash );
507
+ }
508
+
509
+ // also set its timeline preview, if received
510
+ if ( $check['output']->timeline_previews ) {
511
+ $vid->updateMetaValue( 'timeline_previews', $check['output']->timeline_previews );
512
+ }
513
+
514
+ // save changes for this video
515
+ $vid->save();
516
+
517
+ // purge HTML caches for all posts where players containing this video are present
518
+ $players = $fv_fp->get_players_by_video_ids( $vid->getId() );
519
+ foreach ( $players as $player ) {
520
+ if ( $posts = $player->getMetaValue( 'post_id' ) ) {
521
+ foreach ( $posts as $post_id ) {
522
+ wp_update_post( array( 'ID' => $post_id ) );
523
+ }
524
+ }
525
+ }
526
+ }
527
+ } else {
528
+ // video processed, replace its SRC
529
+ $fv_fp->current_video()->set( 'src', $check['output']->src[0] );
530
+
531
+ // also replace its thumbnail / splash
532
+ if ( $check['output']->thumbnail ) {
533
+ $fv_fp->current_video()->set( 'splash', $check['output']->thumbnail );
534
+ } else if ( $check['output']->splash ) {
535
+ $fv_fp->current_video()->set( 'splash', $check['output']->splash );
536
+ }
537
+
538
+ // also set its timeline preview, if received
539
+ if ( $check['output']->timeline_previews ) {
540
+ $fv_fp->current_video()->updateMetaValue( 'timeline_previews', $check['output']->timeline_previews );
541
+ }
542
+
543
+ // save changes for this video
544
+ $fv_fp->current_video()->save();
545
+
546
+ // purge HTML caches for all posts where this player is present
547
+ if ( $posts = $fv_fp->current_player()->getMetaValue( 'post_id' ) ) {
548
+ foreach ( $posts as $post_id ) {
549
+ wp_update_post( array( 'ID' => $post_id ) );
550
+ }
551
+ }
552
+ }
553
+ }
554
+
555
+ return $check;
556
+ }
557
+
558
+ /**
559
+ * Create the job database entry.
560
+ *
561
+ * @param array $args Job configuration
562
+ * $args = array(
563
+ * 'source' (string) Source file URL
564
+ * 'target' (string) Target video folder
565
+ * 'encryption' (bool) (optional, encoder-features-dependent) Encrypt the HLS stream or not
566
+ * 'trailer' (bool) (optional, encoder-features-dependent) Should it be a small part of video only
567
+ *
568
+ * @global object $wpdb WordPress database object
569
+ *
570
+ * @return ID Job ID
571
+ */
572
+ protected function job_create( $args ) {
573
+ global $wpdb;
574
+ global $fv_fp;
575
+
576
+ $args = wp_parse_args( $args, array(
577
+ 'encryption' => false,
578
+ 'trailer' => false,
579
+ 'video_id' => false
580
+ ) );
581
+
582
+ // first we instert the table row with basic data and remember the row ID
583
+ $wpdb->insert( $this->table_name, array(
584
+ 'date_created' => date("Y-m-d H:i:s"),
585
+ 'source' => $args['source'],
586
+ 'target' => $args['target'],
587
+ 'type' => $this->encoder_id,
588
+ 'mime' => $fv_fp->get_mime_type( $args['source'] ),
589
+ 'status' => 'created',
590
+ 'output' => $this->prepare_job_output_column_value(),
591
+ 'args' => '',
592
+ 'author' => get_current_user_id()
593
+ ), array(
594
+ '%s',
595
+ '%s',
596
+ '%s',
597
+ '%s',
598
+ '%s',
599
+ '%s',
600
+ '%s',
601
+ '%s',
602
+ '%d'
603
+ ));
604
+
605
+ $job_id = $wpdb->insert_id;
606
+ if( !$job_id ) {
607
+ wp_send_json( array('error' => 'Database error') );
608
+ return;
609
+ }
610
+
611
+ // we apply extra sanitizaion as some encoders (such as Coconut) use bare text format for their configs
612
+ $source = $this->util__escape_source($args['source']);
613
+
614
+ // we apply the URL signatures/tokens
615
+ add_filter( 'fv_player_secure_link_timeout', array( $this, 'job_create_expiration' ) );
616
+ $source = apply_filters( 'fv_flowplayer_video_src', $source, array( 'dynamic' => true ) );
617
+
618
+ // once we have the row ID, we generate the configuration
619
+ $conf_array = array(
620
+ 'source' => $source,
621
+ 'target' => $args['target'],
622
+ 'job_id' => $job_id,
623
+ 'video_id' => $args['video_id'],
624
+ );
625
+
626
+ if ( isset( $args['encryption'] ) ) {
627
+ $conf_array['encryption'] = $args['encryption'];
628
+ }
629
+
630
+ if ( isset( $args['trailer'] ) ) {
631
+ $conf_array['trailer'] = $args['trailer'];
632
+ }
633
+
634
+ $conf = $this->get_conf( $conf_array );
635
+
636
+ // store the final configuration
637
+ $wpdb->update( $this->table_name, array(
638
+ 'args' => json_encode( $conf )
639
+ ), array(
640
+ 'id' => $job_id
641
+ ), array(
642
+ '%s'
643
+ ), array(
644
+ '%d'
645
+ ) );
646
+
647
+ return $job_id;
648
+ }
649
+
650
+ /**
651
+ * Adds filtering options for the jobs listing page.
652
+ */
653
+ function screen_options() {
654
+ $screen = get_current_screen();
655
+ if ( !is_object($screen) || $screen->id != $this->admin_page ) return;
656
+
657
+ $args = array(
658
+ 'label' => __('Jobs per page', 'pippin'),
659
+ 'default' => 25,
660
+ 'option' => 'fv_player_' . $this->encoder_id . '_per_page'
661
+ );
662
+
663
+ add_screen_option( 'per_page', $args );
664
+ }
665
+
666
+ /**
667
+ * Sets the per-page option value for job listing page filter.
668
+ *
669
+ * @param $status string Unused.
670
+ * @param $option string Name of the option we're checking for.
671
+ * @param $value string Value of the option we're checking for.
672
+ *
673
+ * @return string|void
674
+ */
675
+ function set_screen_option($status, $option, $value) {
676
+ if ( 'fv_player_' . $this->encoder_id . '_per_page' == $option ) return $value;
677
+ }
678
+
679
+ /**
680
+ * Adds the title and tabs for the jobs listing encoder page in Admin.
681
+ */
682
+ function tools_panel() {
683
+ if ( !$this->is_configured() ) {
684
+ $this->tools_panel_settings();
685
+ return;
686
+ }
687
+
688
+ ?>
689
+ <div class="wrap">
690
+ <h1 class="wp-heading-inline">FV Player <?php echo $this->encoder_name; ?> Video Encoding Jobs</h1>
691
+ <h2 class="nav-tab-wrapper">
692
+ <a href="<?php echo add_query_arg( 'page', $this->encoder_wp_url_slug, admin_url('admin.php') ) ?>" class="nav-tab<?php if( $this->tools_panel_is('jobs') ) echo ' nav-tab-active'; ?>">Jobs</a>
693
+ <a href="<?php echo add_query_arg( array('page' => $this->encoder_wp_url_slug ,'panel' => 'settings'), admin_url('admin.php') ) ?>" class="nav-tab<?php if( $this->tools_panel_is('settings') ) echo ' nav-tab-active'; ?>">Settings</a>
694
+ </h2>
695
+ <?php
696
+ if( $this->tools_panel_is('settings') ) {
697
+ $this->tools_panel_settings();
698
+ } else {
699
+ $this->tools_panel_jobs();
700
+ }
701
+ ?>
702
+ </div>
703
+ <?php
704
+ }
705
+
706
+ /**
707
+ * Checks what kind of tab we have active in the jobs listing page in Admin.
708
+ *
709
+ * @param boolean $kind The kind of tab we're comparing currently displayed tab with.
710
+ *
711
+ * @return bool Returns true if the tab we're looking for is active, false otherwise.
712
+ */
713
+ function tools_panel_is( $kind = false ) {
714
+ $panel = !empty( $_GET['panel'] ) ? $_GET['panel'] : 'jobs';
715
+ return strcmp( $panel, $kind ) == 0;
716
+ }
717
+
718
+ /**
719
+ * Includes JS for the extending encoder class.
720
+ *
721
+ * @param $page Auto-filled by WP by the page slug at which we're looking.
722
+ */
723
+ public function admin_enqueue_scripts( $page ) {
724
+ if( $page == 'post.php' || $page == 'post-new.php' || $page == 'toplevel_page_fv_player' || $page == 'settings_page_fvplayer' || $page == 'fv-player_page_' . $this->encoder_wp_url_slug ) {
725
+ wp_register_script('fv_player_' . $this->encoder_id . '_admin', plugins_url( 'js/admin.js', $this->getFILE() ), array('jquery'), filemtime( dirname( $this->getFILE() ) . '/js/admin.js') );
726
+ wp_enqueue_script('fv_player_' . $this->encoder_id . '_admin');
727
+ wp_localize_script( 'fv_player_' . $this->encoder_id . '_admin', $this->encoder_id . '_pending_jobs', $this->jobs_check(true) );
728
+ }
729
+ }
730
+
731
+ /**
732
+ * Adds a hidden encoding job ID field into the editor.
733
+ */
734
+ function shortcode_editor_item() {
735
+ // TODO: The field has to start with fv_wp_flowplayer_field_ which is not easy to keep in mind!
736
+ ?>
737
+ <input type="hidden" id="fv_wp_flowplayer_field_encoding_job_id" name="fv_wp_flowplayer_field_encoding_job_id" />
738
+ <?php
739
+ }
740
+
741
+ /**
742
+ * Converts 'Tom & Jerry - "The Best" show' to Tom-Jerry-The-Best-show to
743
+ * ensure safe directory names
744
+ *
745
+ * @param string $filename The filename of the source video
746
+ *
747
+ * @return string Sanitized file URL - name of the resulting folder for video
748
+ */
749
+ function util__escape_filename( $filename ) {
750
+ // allow only safe characters
751
+ $filename = preg_replace('/[^A-Za-z0-9\-]/m', '-', $filename);
752
+ $filename = preg_replace('/-{2,}/m', '-', $filename);
753
+ // remove - at start or beginning
754
+ $filename = preg_replace('/^-|-$/m', '', $filename);
755
+ return $filename;
756
+ }
757
+
758
+ /**
759
+ * Without this Coconut wouldn't accept file URLs with symbols like ' ' or
760
+ * & in it
761
+ *
762
+ * @param string $url Source video file URL
763
+ *
764
+ * @return string Sanitized file URL
765
+ */
766
+ function util__escape_source( $url ) {
767
+ $url_components = parse_url($url);
768
+ $old_path = $url_components['path'];
769
+
770
+ $url_components['path'] = str_replace( array('%20','+'), ' ', $url_components['path']);
771
+
772
+ $url_components['path'] = rawurlencode($url_components['path']);
773
+ $url_components['path'] = str_replace('%2F', '/', $url_components['path']);
774
+ $url_components['path'] = str_replace('%2B', '+', $url_components['path']);
775
+
776
+ $url = str_replace($old_path, $url_components['path'], $url);
777
+ return $url;
778
+ }
779
+
780
+ /**
781
+ * Convert fv_player_encoding_category ID to a nice folder name.
782
+ * If you have:
783
+ * - Documentaries
784
+ * -- Nature
785
+ * --- Wildlife & Adventure
786
+ *
787
+ * you get: Documentaries/Nature/Wildlife-Adventure
788
+ *
789
+ * @param string $url Source video file URL
790
+ *
791
+ * @return string Sanitized file URL
792
+ */
793
+ function util__category_id_to_folder( $category_id ) {
794
+ $folder = false;
795
+
796
+ $category = get_term($category_id);
797
+ if( !is_wp_error($category) ) {
798
+ $hierarchy = array( $this->util__escape_filename($category->name) );
799
+ $ancestors = get_ancestors( $category->term_id, 'fv_player_encoding_category', 'taxonomy' );
800
+ foreach( (array)$ancestors as $ancestor ) {
801
+ $ancestor_term = get_term($ancestor, 'fv_player_encoding_category');
802
+ $hierarchy[] = $this->util__escape_filename($ancestor_term->name);
803
+ }
804
+ $hierarchy = array_reverse($hierarchy);
805
+ $folder = implode('/', $hierarchy);
806
+ }
807
+
808
+ return $folder;
809
+ }
810
+
811
+ /**
812
+ * Get sanitized file path. For example https://cdn.site.com/lessons/music/composing/lesson-1.mp4 gives you /lessons/music/composing/lesson-1
813
+ *
814
+ * @param $string Filename or URL
815
+ * @return string
816
+ */
817
+ function util__sanitize_target( $target ) {
818
+
819
+ $target = trim($target);
820
+
821
+ // take path only if it's full URL
822
+ $parsed = parse_url($target);
823
+ if( !empty($parsed['path']) ) {
824
+ $target = trim( $parsed['path'], '/' );
825
+ }
826
+
827
+ // sanitize filename
828
+ $target = explode('/', $target);
829
+
830
+ // deal with %20 encoding of spaces
831
+ $target = array_map( 'urldecode', $target );
832
+
833
+ $filename = $target[ count($target) - 1 ];
834
+
835
+ // remove file extension
836
+ if( strrpos( $filename, ".") ) {
837
+ $filename = substr( $filename, 0, strrpos( $filename, "."));
838
+ }
839
+
840
+ $filename = $this->util__escape_filename($filename);
841
+
842
+ // we're done
843
+ $target[ count($target) - 1 ] = $filename;
844
+ $target = join('/', $target);
845
+
846
+ return $target;
847
+ }
848
+
849
+ /**
850
+ * Sends an e-mail about changes in the encoding job.
851
+ *
852
+ * @param $id int int ID of the job to send this e-mail about.
853
+ * @param $author_id int ID of the author of the encoding job.
854
+ * @param $status string Status of the processed encoding job.
855
+ * @param $target string The actual target for the processed encoding job.
856
+ * @param $result string Text representation of the result, used to send any error messages along with the e-mail.
857
+ */
858
+ function send_email( $id, $author_id, $status, $target, $result ) {
859
+ $user = get_userdata( $author_id );
860
+ $to = $user->user_email;
861
+ $headers = array('Content-Type: text/plain; charset=UTF-8');
862
+
863
+ $subject = "[". get_bloginfo( 'name' ) . "] FV Player {$this->encoder_name}: Job #" . $id . " " . $target . " " . $status ;
864
+
865
+ $body = "Hello " . $user->display_name . ",\r\n";
866
+ $body .= "Your encoding job #" . $id . " " . $target . " has ";
867
+
868
+ if( $status == 'completed' ) {
869
+ $body .= "successfully finished.\r\n";
870
+ } else {
871
+ $body .= "run into some problems.\r\n";
872
+ $body .= $result."\r\n";
873
+ }
874
+
875
+ $body .= "\r\nManage video encoding jobs <a href='". admin_url( 'admin.php?page=' . $this->encoder_wp_url_slug ) ."'>here</a>";
876
+
877
+ wp_mail( $to, $subject, $body, $headers );
878
+ }
879
+
880
+ /**
881
+ * Updates DB table definition for the extending plugin.
882
+ * Used when a version change of the extending plugin is detected,
883
+ * as well as displaying jobs listing page.
884
+ */
885
+ public function plugin_update_database() {
886
+ global $wpdb;
887
+
888
+ $sql = "CREATE TABLE ". $this->table_name ." (
889
+ id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
890
+ id_video bigint(20) unsigned NOT NULL,
891
+ job_id varchar(45) NOT NULL,
892
+ date_created datetime NOT NULL,
893
+ date_checked datetime NOT NULL,
894
+ source varchar(1024) NOT NULL,
895
+ target varchar(1024) NOT NULL,
896
+ type varchar(64) NOT NULL,
897
+ status varchar(64) NOT NULL,
898
+ progress varchar(64),
899
+ error varchar(1024),
900
+ mime varchar(64),
901
+ args TEXT,
902
+ result TEXT,
903
+ output TEXT,
904
+ video_data TEXT,
905
+ author bigint(20) unsigned NOT NULL default '0',
906
+ PRIMARY KEY (id),
907
+ KEY source (source(191)),
908
+ KEY type (type),
909
+ KEY status (status),
910
+ KEY job_id (job_id(15)),
911
+ )" . $wpdb->get_charset_collate() . ";";
912
+
913
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
914
+ dbDelta( $sql );
915
+ }
916
+
917
+ /**
918
+ * Displays general notices on top in Admin pages.
919
+ */
920
+ abstract function admin_notices();
921
+
922
+ /**
923
+ * Returns an updated $conf variable with settings for the extending Encoder class.
924
+ *
925
+ * @param $conf Pre-populated configuration array into which the extending Encoder's class configuration should go.
926
+ *
927
+ * @return array Returns an updated $conf variable with settings for the extending Encoder class.
928
+ */
929
+ abstract function default_settings( $conf );
930
+
931
+ /**
932
+ * Verifies the currently used endpoint supported by the extending Encoder, such as (S)FTP or S3 credentials
933
+ * and either directly outputs a JSON-formatted error (for AJAX purposes) or returns the error to be processed further.
934
+ *
935
+ * @return mixed Returns TRUE if the current endpoint is set up properly, an error object/array otherwise.
936
+ * If we're running an AJAX request, this method must return a valid JSON-formatted error for that request
937
+ * by utilizing the wp_send_json() method in this format: wp_send_json( array('error' => $error) );
938
+ */
939
+ protected abstract function verify_active_endpoint( $target );
940
+
941
+ /*
942
+ * Creates default Encoder's configuration.
943
+ */
944
+ abstract function get_conf( $args );
945
+
946
+ /**
947
+ * Determines whether this Encoder has been properly configured.
948
+ */
949
+ abstract function is_configured();
950
+
951
+ /**
952
+ * Prepares and returns data to be inserted into the "output" column of this encoder's DB table.
953
+ */
954
+ abstract protected function prepare_job_output_column_value();
955
+
956
+ /**
957
+ * Retrieves new encoding job expiration time, used in URL signatures / tokens.
958
+ *
959
+ * @param $ttl An optional TTL parameter.
960
+ *
961
+ * @return int Returns the duration in seconds for which this job is valid.
962
+ */
963
+ abstract public function job_create_expiration( $ttl );
964
+
965
+ /**
966
+ * Update job status
967
+ *
968
+ * @param object|int $pending_job Table row from encoder's table or its job ID
969
+ *
970
+ * @global object $wpdb WordPress database object
971
+ * @global object $fv_fp FV Player
972
+ *
973
+ * @return array
974
+ * array(
975
+ * 'result' object Job info from the Encoder
976
+ * 'status' string Valid values are: "processing", "completed", "error"
977
+ * 'output' object URLs for all processed resources (such as video qualities, thumbnails etc.)
978
+ * )
979
+ */
980
+ abstract protected function job_check( $pending_job );
981
+
982
+ /**
983
+ * Submits the job to the Encoder service and stores the result in a table.
984
+ *
985
+ * @param int $job_id Job ID
986
+
987
+ * @global object $wpdb WordPress database object
988
+ * @global object $fv_fp FV Player instance to load options with
989
+ *
990
+ * @return bool Result
991
+ */
992
+ abstract function job_submit( $id );
993
+
994
+ /**
995
+ * Displays the jobs listing page contents.
996
+ */
997
+ abstract function tools_panel_jobs();
998
+
999
+ /**
1000
+ * Displays the Encoder's settings page contents.
1001
+ */
1002
+ abstract function tools_panel_settings();
1003
+
1004
+ /**
1005
+ * Must return __FILE__ from the extending class.
1006
+ * Used to determine plugin path for registering JS and CSS.
1007
+ */
1008
+ abstract function getFILE();
1009
+
1010
+ /**
1011
+ * Send out an e-mail notification of an encoding job change.
1012
+ * To be used when a WebHook is fired from the Encoding service.
1013
+ */
1014
+ abstract function email_notification();
1015
+
1016
+ }
models/xml-video-sitemap.php CHANGED
@@ -235,7 +235,12 @@ class FV_Xml_Video_Sitemap {
235
  }
236
 
237
  if( $aCategories = get_the_category($objPost->ID) ) {
238
- $xml_video['category'] = mb_substr( implode(', ',wp_list_pluck($aCategories,'name')), 0, 250 );
 
 
 
 
 
239
  }
240
  $xml_video['publication_date'] = get_the_date(DATE_W3C, $objPost->ID);
241
 
235
  }
236
 
237
  if( $aCategories = get_the_category($objPost->ID) ) {
238
+ $categories = implode(', ',wp_list_pluck($aCategories,'name'));
239
+ if( function_exists('mb_substr') ) {
240
+ $xml_video['category'] = mb_substr( $categories, 0, 250 );
241
+ } else {
242
+ $xml_video['category'] = substr( $categories, 0, 250 );
243
+ }
244
  }
245
  $xml_video['publication_date'] = get_the_date(DATE_W3C, $objPost->ID);
246
 
readme.txt CHANGED
@@ -359,6 +359,28 @@ Thank you for being part of the HMTL 5 mobile video revolution!
359
 
360
  == Changelog ==
361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
362
  = 7.5.10.727 - 2021/10/06 =
363
 
364
  * Airplay - removing the button if the video type is not supported
359
 
360
  == Changelog ==
361
 
362
+ = 7.5.12.727 - 2021/11/25 =
363
+
364
+ * Bugfix - Playlist tabs not pausing the old tab player properly
365
+ * Bugfix - Position Saving - do not use index.m3u8 as the video ID
366
+ * Bugfix - Video link issue for videos over 1 hour
367
+ * Compatibility - Bunny.net WordPress CDN Plugin
368
+ * Compatibility - WP Rocket Used CSS
369
+ * Lightbox - Fancybox updated - double tap on image zooms in
370
+ * Linode Object Storage support
371
+ * Video upload support for FV Player Coconut and FV Player Bunny Stream
372
+
373
+ = 7.5.11.727 - 2021/10/14 =
374
+
375
+ * Click to unmute - adding translations
376
+ * Click to unmute - only show on hover
377
+ * Click to unmute - only show once in playlist
378
+ * Live streams - fix buffer indicator bug for long streams
379
+ * Media Library - fix for picking of old FV Player Coconut jobs
380
+ * PHP warnings - fix multibyte functions used without check
381
+ * Store dismissed wp-admin popup notices also in cookies
382
+ * Support for FV Player Coconut video uploads - fixes
383
+
384
  = 7.5.10.727 - 2021/10/06 =
385
 
386
  * Airplay - removing the button if the video type is not supported
view/admin.php CHANGED
@@ -686,35 +686,50 @@ function fv_flowplayer_admin_integrations() {
686
 
687
 
688
  function fv_flowplayer_admin_mobile() {
689
- global $fv_fp;
690
- ?>
691
- <table class="form-table2">
692
  <?php $fv_fp->_get_checkbox(__('Use native fullscreen on mobile', 'fv-wordpress-flowplayer'), 'mobile_native_fullscreen', __('Stops popups, ads or subtitles from working, but provides faster interface. We set this for Android < 4.4 and iOS < 7 automatically.', 'fv-wordpress-flowplayer') ); ?>
693
  <?php $fv_fp->_get_checkbox(__('Force fullscreen on mobile', 'fv-wordpress-flowplayer'), 'mobile_force_fullscreen', __('Video playback will start in fullscreen. iPhone with iOS < 10 always forces fullscreen for video playback.', 'fv-wordpress-flowplayer') ); ?>
694
  <?php $fv_fp->_get_checkbox(__('Alternative iOS fullscreen mode', 'fv-wordpress-flowplayer'), 'mobile_alternative_fullscreen', __("Works for iOS < 12 which doesn't support HTML5 fullscreen. Only use if you see site elements such as header bar ovelaying the player in fullscreen on iOS.", 'fv-wordpress-flowplayer') ); ?>
695
  <?php $fv_fp->_get_checkbox(__('Force landscape orientation in fullscreen', 'fv-wordpress-flowplayer'), 'mobile_landscape_fullscreen', __("Works on the Android mobile, not supported on iOS unfortunately.", 'fv-wordpress-flowplayer') ); ?>
696
- <tr>
697
- <td colspan="4">
698
- <input type="submit" name="fv-wp-flowplayer-submit" class="button-primary" value="<?php _e('Save All Changes', 'fv-wordpress-flowplayer'); ?>" />
699
- </td>
700
- </tr>
701
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
702
  <?php
703
  }
704
 
705
 
706
  function fv_flowplayer_admin_seo() {
707
- global $fv_fp;
708
- ?>
709
- <table class="form-table2">
710
- <?php $fv_fp->_get_checkbox(__('Use Schema.org markup', 'fv-wordpress-flowplayer'), array( 'integrations', 'schema_org' ), __(' Adds the video meta data information for search engines.', 'fv-wordpress-flowplayer') ); ?>
711
  <?php do_action( 'fv_flowplayer_admin_seo_after'); ?>
712
- <tr>
713
- <td colspan="4">
714
- <input type="submit" name="fv-wp-flowplayer-submit" class="button-primary" value="<?php _e('Save All Changes', 'fv-wordpress-flowplayer'); ?>" />
715
- </td>
716
- </tr>
717
- </table>
718
  <?php
719
  }
720
 
@@ -1733,6 +1748,8 @@ add_meta_box( 'fv_flowplayer_default_options', __('Sitewide FV Player Defaults',
1733
  add_meta_box( 'fv_flowplayer_integrations', __('Integrations/Compatibility', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_integrations', 'fv_flowplayer_settings', 'normal' );
1734
  add_meta_box( 'fv_flowplayer_mobile', __('Mobile Settings', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_mobile', 'fv_flowplayer_settings', 'normal' );
1735
  add_meta_box( 'fv_flowplayer_seo', __('Video SEO', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_seo', 'fv_flowplayer_settings', 'normal' );
 
 
1736
  if( !class_exists('FV_Player_Pro') ) {
1737
  add_meta_box( 'fv_player_pro', __('Pro Features', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_pro', 'fv_flowplayer_settings', 'normal', 'low' );
1738
  }
686
 
687
 
688
  function fv_flowplayer_admin_mobile() {
689
+ global $fv_fp;
690
+ ?>
691
+ <table class="form-table2">
692
  <?php $fv_fp->_get_checkbox(__('Use native fullscreen on mobile', 'fv-wordpress-flowplayer'), 'mobile_native_fullscreen', __('Stops popups, ads or subtitles from working, but provides faster interface. We set this for Android < 4.4 and iOS < 7 automatically.', 'fv-wordpress-flowplayer') ); ?>
693
  <?php $fv_fp->_get_checkbox(__('Force fullscreen on mobile', 'fv-wordpress-flowplayer'), 'mobile_force_fullscreen', __('Video playback will start in fullscreen. iPhone with iOS < 10 always forces fullscreen for video playback.', 'fv-wordpress-flowplayer') ); ?>
694
  <?php $fv_fp->_get_checkbox(__('Alternative iOS fullscreen mode', 'fv-wordpress-flowplayer'), 'mobile_alternative_fullscreen', __("Works for iOS < 12 which doesn't support HTML5 fullscreen. Only use if you see site elements such as header bar ovelaying the player in fullscreen on iOS.", 'fv-wordpress-flowplayer') ); ?>
695
  <?php $fv_fp->_get_checkbox(__('Force landscape orientation in fullscreen', 'fv-wordpress-flowplayer'), 'mobile_landscape_fullscreen', __("Works on the Android mobile, not supported on iOS unfortunately.", 'fv-wordpress-flowplayer') ); ?>
696
+ <tr>
697
+ <td colspan="4">
698
+ <input type="submit" name="fv-wp-flowplayer-submit" class="button-primary" value="<?php _e('Save All Changes', 'fv-wordpress-flowplayer'); ?>" />
699
+ </td>
700
+ </tr>
701
+ </table>
702
+ <?php
703
+ }
704
+
705
+
706
+ function fv_flowplayer_admin_privacy() {
707
+ global $fv_fp;
708
+ ?>
709
+ <table class="form-table2">
710
+ <?php $fv_fp->_get_checkbox(__('Disable local storage', 'fv-wordpress-flowplayer'), 'disable_localstorage', __('Remember video position will not work for non logged users. Video volume, mute status and subtitles selection will also not be stored.', 'fv-wordpress-flowplayer') ); ?>
711
+ <tr>
712
+ <td colspan="4">
713
+ <input type="submit" name="fv-wp-flowplayer-submit" class="button-primary" value="<?php _e('Save All Changes', 'fv-wordpress-flowplayer'); ?>" />
714
+ </td>
715
+ </tr>
716
+ </table>
717
  <?php
718
  }
719
 
720
 
721
  function fv_flowplayer_admin_seo() {
722
+ global $fv_fp;
723
+ ?>
724
+ <table class="form-table2">
725
+ <?php $fv_fp->_get_checkbox(__('Use Schema.org markup', 'fv-wordpress-flowplayer'), array( 'integrations', 'schema_org' ), __(' Adds the video meta data information for search engines.', 'fv-wordpress-flowplayer') ); ?>
726
  <?php do_action( 'fv_flowplayer_admin_seo_after'); ?>
727
+ <tr>
728
+ <td colspan="4">
729
+ <input type="submit" name="fv-wp-flowplayer-submit" class="button-primary" value="<?php _e('Save All Changes', 'fv-wordpress-flowplayer'); ?>" />
730
+ </td>
731
+ </tr>
732
+ </table>
733
  <?php
734
  }
735
 
1748
  add_meta_box( 'fv_flowplayer_integrations', __('Integrations/Compatibility', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_integrations', 'fv_flowplayer_settings', 'normal' );
1749
  add_meta_box( 'fv_flowplayer_mobile', __('Mobile Settings', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_mobile', 'fv_flowplayer_settings', 'normal' );
1750
  add_meta_box( 'fv_flowplayer_seo', __('Video SEO', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_seo', 'fv_flowplayer_settings', 'normal' );
1751
+ add_meta_box( 'fv_flowplayer_privacy', __('Privacy Settings', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_privacy', 'fv_flowplayer_settings', 'normal' );
1752
+
1753
  if( !class_exists('FV_Player_Pro') ) {
1754
  add_meta_box( 'fv_player_pro', __('Pro Features', 'fv-wordpress-flowplayer'), 'fv_flowplayer_admin_pro', 'fv_flowplayer_settings', 'normal', 'low' );
1755
  }