<?php

/**
 * @package SP Page Builder
 * @author JoomShaper http://www.joomshaper.com
 * @copyright Copyright (c) 2010 - 2025 JoomShaper
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
 */
//no direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;

class SppagebuilderAddonVideo extends SppagebuilderAddons
{
	/**
	 * The addon frontend render method.
	 * The returned HTML string will render to the frontend page.
	 *
	 * @return  string  The HTML string.
	 * @since   1.0.0
	 */
	public function render()
	{
		$settings = $this->addon->settings;
		$class = (isset($settings->class) && $settings->class) ? $settings->class : '';
		$title = (isset($settings->title) && $settings->title) ? $settings->title : '';
		$video_aria_label = (isset($settings->video_aria_label) && $settings->video_aria_label) ? $settings->video_aria_label : '';
		$video_aria_described_by = (isset($settings->video_aria_described_by) && $settings->video_aria_described_by) ? $settings->video_aria_described_by : '';
		$heading_selector = (isset($settings->heading_selector) && $settings->heading_selector) ? $settings->heading_selector : 'h3';

		// Options
		$url 			= (isset($settings->url) && $settings->url) ? $settings->url : '';
		$video_title 	= "";
		$no_cookie 		= (isset($settings->no_cookie) && $settings->no_cookie) ? $settings->no_cookie : 0;
		$show_rel_video = (isset($settings->show_rel_video) && $settings->show_rel_video) ? '&rel=1' : '&rel=0';
		$start_time 	= (isset($settings->start_time) && $settings->start_time) ? ('&start=' . $settings->start_time) : '';
		$end_time 		= (isset($settings->end_time) && $settings->end_time) ? ('&end=' . $settings->end_time) : '';
		$youtube_shorts = (isset($settings->youtube_shorts) && $settings->youtube_shorts) ? $settings->youtube_shorts : 0;
		$aspect_ratio   = (isset($settings->aspect_ratio) && $settings->aspect_ratio && $youtube_shorts) ? $settings->aspect_ratio : '16by9';

		$mp4_enable = (isset($settings->mp4_enable) && $settings->mp4_enable) ? $settings->mp4_enable : 0;
		$video_mute = (isset($settings->video_mute) && $settings->video_mute) ? $settings->video_mute : 0;

		$mp4_video = (isset($settings->mp4_video) && $settings->mp4_video) ? $settings->mp4_video : '';
		$mp4_video_src = isset($mp4_video->src) ? $mp4_video->src : $mp4_video;

		$vimeo_show_author 			= (isset($settings->vimeo_show_author) && $settings->vimeo_show_author) ? "byline=1" : "byline=0";
		$vimeo_mute_video  			= (isset($settings->vimeo_mute_video) && $settings->vimeo_mute_video) ? "muted=1" : "muted=0";
		$vimeo_show_video_title  	= (isset($settings->vimeo_show_video_title) && $settings->vimeo_show_video_title) ? "title=1" : "title=0";
		$vimeo_show_author_profile  = (isset($settings->vimeo_show_author_profile) && $settings->vimeo_show_author_profile) ? "portrait=1" : "portrait=0";
		$preload = (isset($settings->video_preload) && $settings->video_preload) ? 'preload="'. $settings->video_preload .'"' : '';

		if ($mp4_video_src && (strpos($mp4_video_src, "http://") !== false || strpos($mp4_video_src, "https://") !== false))
		{
			$mp4_video = $mp4_video_src;
		}
		else
		{
			if (!empty($mp4_video))
			{
				$mp4_video = Uri::base(true) . '/' . $mp4_video_src;
			}
		}

		$ogv_video = (isset($settings->ogv_video) && $settings->ogv_video) ? $settings->ogv_video : '';
		$ogv_video_src = isset($ogv_video->src) ? $ogv_video->src : $ogv_video;

		if ($ogv_video_src && (strpos($ogv_video_src, "http://") !== false || strpos($ogv_video_src, "https://") !== false))
		{
			$ogv_video = $ogv_video_src;
		}
		else
		{
			if (!empty($ogv_video))
			{
				$ogv_video = Uri::base(true) . '/' . $ogv_video_src;
			}
		}

		$video_subtitle = (isset($settings->video_subtitle) && $settings->video_subtitle) ? $settings->video_subtitle : '';
		$video_subtitle_src = isset($video_subtitle->src) ? $video_subtitle->src : $video_subtitle;

		if ($video_subtitle_src && (strpos($video_subtitle_src, "http://") !== false || strpos($video_subtitle_src, "https://") !== false))
		{
			$video_subtitle = $video_subtitle_src;
		}
		else
		{
			if (!empty($video_subtitle))
			{
				$video_subtitle = Uri::base(true) . '/' . ltrim($video_subtitle_src, '/');
			}
		}

		$video_subtitle_srclang = (isset($settings->video_subtitle_srclang) && $settings->video_subtitle_srclang) ? $settings->video_subtitle_srclang : 'en';
		$video_subtitle_label = (isset($settings->video_subtitle_label) && $settings->video_subtitle_label) ? $settings->video_subtitle_label : 'English';

		$show_control = (isset($settings->show_control) && $settings->show_control) ? $settings->show_control : 0;
		$enable_download = (isset($settings->download_video) && $settings->download_video) ? $settings->download_video : 0;
		$video_loop = (isset($settings->video_loop) && $settings->video_loop) ? $settings->video_loop : 0;
		$autoplay_video = (isset($settings->autoplay_video) && $settings->autoplay_video) ? $settings->autoplay_video : 0;
		$video_poster = (isset($settings->video_poster) && $settings->video_poster) ? $settings->video_poster : '';
		$video_poster_src = isset($video_poster->src) ? $video_poster->src : $video_poster;

		if ($video_poster_src && (strpos($video_poster_src, "http://") !== false || strpos($video_poster_src, "https://") !== false))
		{
			$video_poster = $video_poster_src;
		}
		else
		{
			if (!empty($video_poster))
			{
				$video_poster = Uri::base(true) . '/' . $video_poster_src;
			}
		}

		// Image lazy load
		$config = ComponentHelper::getParams('com_sppagebuilder');
		$lazyload = $config->get('lazyloadimg', '0');

		// Output
		$output  = '';
		$src = '';

		if ($url)
		{
			$video = parse_url($url);

			$youtube_no_cookie = $no_cookie ? '-nocookie' : '';

			if(array_key_exists('host', $video)) {
				switch ($video['host'])
				{
					case 'youtu.be':
						$id 		 = trim($video['path'], '/');
						$src 		 = '//www.youtube' . $youtube_no_cookie . '.com/embed/' . $id . '?iv_load_policy=3' . $show_rel_video . $start_time . $end_time;
						$video_title = (isset($settings->video_title) && $settings->video_title) ? $settings->video_title : Text::_("COM_SPPAGEBUILDER_ADDON_VIDEO_TITLE_DEFAULT_TEXT");
						break;

					case 'www.youtube.com':
					case 'youtube.com':
						$query = [];
						$playlist_id = null;

						if(array_key_exists('query', $video)) {
							parse_str($video['query'], $query);
						}

						if($video['path'] === '/playlist') {
							if (preg_match('/\blist=([^&]+)/', $video['query'], $matches)) {
								$playlist_id = $matches[1];
							}
						}

						$src 		 = '';
						
						if($playlist_id) {
							$src 	 = '//www.youtube.com/embed/?listType=playlist&list=' . $playlist_id;
						} else {
							$id  		 = ($youtube_shorts) ? str_replace('/shorts/', "", $video['path']) : $query['v'];
							$src 	 = '//www.youtube' . $youtube_no_cookie . '.com/embed/' . $id . '?iv_load_policy=3' . $show_rel_video . $start_time . $end_time;
						}

						$video_title = (isset($settings->video_title) && $settings->video_title) ? $settings->video_title : Text::_("COM_SPPAGEBUILDER_ADDON_VIDEO_TITLE_DEFAULT_TEXT");
						break;
						
					case 'vimeo.com':
					case 'www.vimeo.com':
					case 'player.vimeo.com':
						$initialSrc = $url;

						if($video['host'] !== 'player.vimeo.com') {
							$id = trim($video['path'], '/');
							$initialSrc = "//player.vimeo.com/video/{$id}";
						}

						$embeddedParameter = array($vimeo_mute_video, $vimeo_show_author, $vimeo_show_author_profile, $vimeo_show_video_title);
						$src = self::setEmbeddedParameter($embeddedParameter, $initialSrc);
						break;
				}
			}
		}

		// Lazy load ifram
		$placeholder = $src == '' ? false : $this->get_image_placeholder($src);

		$output  .= '<div class="sppb-addon sppb-addon-video ' . $class . '">';
		$output .= ($title) ? '<' . $heading_selector . ' class="sppb-addon-title">' . $title . '</' . $heading_selector . '>' : '';
		if ($mp4_enable != 1)
		{			
			$output .= '<div class="sppb-video-block sppb-embed-responsive sppb-embed-responsive-'.$aspect_ratio.'">';
			$output .= '<iframe class="sppb-embed-responsive-item' . ($placeholder ? ' sppb-element-lazy' : '') . '" ' . ($placeholder ? 'style="background:url(' . $placeholder . '); background-size: cover;"' : 'src="' . $src . '"') . ' ' . ($placeholder ? 'data-large="' . $src . '"' : '') . ' ' . ($video_title ? 'title="'.$video_title. '"' : '') . ' allow="accelerometer" webkitAllowFullScreen mozallowfullscreen allowFullScreen loading="lazy" ></iframe>';
			$output .= '</div>';
			
		}
		else
		{
			if ($mp4_video || $ogv_video)
			{
				$output .= '<div class="sppb-addon-video-local-video-wrap">';
				$output .= '<video ' . $preload . ' class="sppb-addon-video-local-source' . ($placeholder ? ' sppb-element-lazy' : '') . '"' . (!empty($video_aria_label) ? ' aria-label="' . $video_aria_label . '"' : '') . (!empty($video_aria_described_by) ? ' aria-describedby="' . $video_aria_described_by . '"' : '') . ($video_loop != 0 ? ' loop' : '') . '' . ($autoplay_video != 0 ? ' autoplay' : '') . '' . ($show_control != 0 ? ' controls' : '') . '' . ($video_mute != 0 ? ' muted' : '') . ' ' . ($lazyload ? 'data-poster="' . $video_poster . '"' : ' poster="' . $video_poster . '"') . ($enable_download ? '' : ' controlsList="nodownload" oncontextmenu="return false;"') . ' playsinline>';
				if (!empty($mp4_video))
				{
					$output .= '<source ' . ($lazyload ? 'data-large="' . $mp4_video . '"' : 'src="' . $mp4_video . '"') . ' type="video/mp4">';
				}
				if (!empty($ogv_video))
				{
					$output .= '<source ' . ($lazyload ? 'data-large="' . $ogv_video . '"' : 'src="' . $ogv_video . '"') . ' type="video/ogg">';
				}
				if (!empty($video_subtitle))
				{
					$output .= '<track src="' . htmlspecialchars($video_subtitle, ENT_QUOTES, 'UTF-8') . '" kind="subtitles" srclang="' . htmlspecialchars($video_subtitle_srclang, ENT_QUOTES, 'UTF-8') . '" label="' . htmlspecialchars($video_subtitle_label, ENT_QUOTES, 'UTF-8') . '" default>';
				}
				$output .= '</video>';
				$output .= '</div>';
			}
		}

		$output .= '</div>';

		return $output;
	}

	public function css()
	{
		$settings = $this->addon->settings;
		$addon_id = "#sppb-addon-" . $this->addon->id;
		$cssHelper = new CSSHelper($addon_id);

		$css = $cssHelper->generateTransformStyle('.sppb-addon-video', $settings, 'transform');

		if((isset($settings->mp4_enable) && $settings->mp4_enable) && (isset($settings->enable_vertical_video) && $settings->enable_vertical_video)) {
			$css .= $addon_id. ' .sppb-addon-video-local-source{
					width: auto;
					left: 50%;
					transform: translateX(-50%);
				}';
		}

		return $css;
	}

	/**
	 * Generate the lodash template string for the frontend editor.
	 *
	 * @return 	string 	The lodash template string.
	 * @since 	1.0.0
	 */
	public static function getTemplate()
	{

		$lodash = new Lodash("#sppb-addon-{{data.id}}");
		$output = '

			<#
				let videoUrl 		  = data.url || ""
				let video_title		  = "";
				const video_aria_label = data?.video_aria_label || "";
				let video_aria_described_by = data?.video_aria_described_by || "";
				let show_rel_video 	  = (typeof data.show_rel_video !== "undefined" && data.show_rel_video) ? "&rel=1" : "&rel=0";
				let embedSrc 		  = ""
				let youtube_no_cookie = data.no_cookie ? "-nocookie" : ""			
				let youtube_shorts 	  = data.youtube_shorts ? data.youtube_shorts : 0;
				let aspect_ratio	  = (data.aspect_ratio && youtube_shorts) ? data.aspect_ratio : "16by9";
				let mp4_enable 		  = (typeof data.mp4_enable == "undefined") ? 0 : data.mp4_enable;
				
				let vimeo_show_author 	   	   = data.vimeo_show_author ? "byline=1" : "byline=0";
				let vimeo_mute_video  	   	   = data.vimeo_mute_video ? "muted=1" : "muted=0";
				let vimeo_show_video_title 	   = data.vimeo_show_video_title ? "title=1" : "title=0";
				let vimeo_show_author_profile  = data.vimeo_show_author_profile ? "portrait=1" : "portrait=0";

				const embeddedParameter = [vimeo_show_author,vimeo_mute_video,vimeo_show_video_title,vimeo_show_author_profile];
				const separator 		= "&";
				let embeddedString      = "";

				let mp4_video = (!_.isEmpty(data.mp4_video) && data.mp4_video) ? data.mp4_video : "https://www.joomshaper.com/media/videos/2017/11/10/pb-intro-video.mp4";

				if (typeof mp4_video !== "undefined" && typeof mp4_video.src !== "undefined") {
					mp4_video = data.mp4_video
				} else {
					mp4_video = {src: data.mp4_video}
				}

				let ogv_video = (!_.isEmpty(data.ogv_video) && data.ogv_video) ? data.ogv_video : "https://www.joomshaper.com/media/videos/2017/11/10/pb-intro-video.mp4";

				if (typeof ogv_video !== "undefined" && typeof ogv_video.src !== "undefined") {
					ogv_video = data.ogv_video
				} else {
					ogv_video = {src: data.ogv_video}
				}

				let video_poster = (!_.isEmpty(data.video_poster) && data.video_poster) ? data.video_poster : "https://www.joomshaper.com/images/2017/11/10/real-time-frontend.jpg";
				
				if (typeof data.video_poster !== "undefined" && typeof data.video_poster.src !== "undefined") {
					video_poster = data.video_poster
				} else {
					video_poster = {src: data.video_poster}
				}

				if ( videoUrl ) {
					let tempAchor = document.createElement("a")
						tempAchor.href = videoUrl

					let videoObj = {
						host    :   tempAchor.hostname,
						path    :   tempAchor.pathname,
						query   :   tempAchor.search.substr(tempAchor.search.indexOf("?") + 1)
					}

					switch( videoObj.host ){
						case "youtu.be":
							var videoId = videoObj.path.trim();
							embedSrc 	= "//www.youtube"+youtube_no_cookie+".com/embed"+ videoId + "?iv_load_policy=3"+ show_rel_video
							video_title = data.video_title ? data.video_title : Joomla.Text._("COM_SPPAGEBUILDER_ADDON_VIDEO_TITLE_DEFAULT_TEXT");
							break;

						case "www.youtube.com":
						case "youtube.com":
							var queryStr = (youtube_shorts) ? videoObj.path.split("/shorts/") : videoObj.query.split("=");
							if(videoObj.path === "/playlist") {
								embedSrc 	 = "//www.youtube.com/embed/?listType=playlist&list="+ videoObj.query.match(/\blist=([^&]+)/)?.[1]
							} else {
								embedSrc 	 = "//www.youtube"+youtube_no_cookie+".com/embed/"+ queryStr[1]+ "?iv_load_policy=3"+ show_rel_video
							}
							video_title  = data.video_title ? data.video_title : Joomla.Text._("COM_SPPAGEBUILDER_ADDON_VIDEO_TITLE_DEFAULT_TEXT");
							break;

						case "www.vimeo.com":
						case "vimeo.com":
						case "player.vimeo.com":
							embedSrc = videoUrl;

							if(videoObj.host !== "player.vimeo.com") {
								var videoId  = videoObj.path.trim();
								embedSrc 	 = "//player.vimeo.com/video"+ videoId;
							}

							_.forEach(embeddedParameter, function(value,key){
								embeddedString += (key > 0) ? separator + value : value;
							});
							
							embedSrc = embedSrc + "?" + embeddedString;	
							break;
					}
				}
			#>';
		$output .= '<style type="text/css">';
		$titleTypographyFallbacks = [
			'font'           => 'data.title_font_family',
			'size'           => 'data.title_fontsize',
			'line_height'    => 'data.title_lineheight',
			'letter_spacing' => 'data.title_letterspace',
			'uppercase'      => 'data.title_font_style?.uppercase',
			'italic'         => 'data.title_font_style?.italic',
			'underline'      => 'data.title_font_style?.underline',
			'weight'         => 'data.title_font_style?.weight',
		];
		$output .= $lodash->typography('.sppb-addon-title', 'data.title_typography', $titleTypographyFallbacks);
		$output .= $lodash->unit('margin-top', '.sppb-addon-title', 'data.title_margin_top', 'px');
		$output .= $lodash->unit('margin-bottom', '.sppb-addon-title', 'data.title_margin_bottom', 'px');
		$output .= $lodash->generateTransformCss('.sppb-addon-video', 'data.transform');
		
		$output .= '
			</style>
	 		<div class="sppb-addon sppb-addon-video {{ data.class }}">
		 		<# if( !_.isEmpty( data.title ) ){ #><{{ data.heading_selector }} class="sppb-addon-title sp-inline-editable-element" data-id={{data.id}} data-fieldName="title" contenteditable="true">{{{ data.title }}}</{{ data.heading_selector }}><# } #>
				<# if(mp4_enable != 1){ #>
					<div class="sppb-iframe-drag-overlay"></div>

					<div class="sppb-video-block sppb-embed-responsive sppb-embed-responsive-{{ aspect_ratio }}">
						<# if(embedSrc){ #>
						<iframe class="sppb-embed-responsive-item" src=\'{{ embedSrc }}\' title= \'{{ video_title }}\' allow="accelerometer"; webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>						
					</div>
					<# } #>
				 <# } else {
					if(mp4_video.src || ogv_video.src){
						#>
						<div class="sppb-addon-video-local-video-wrap">
							<video class="sppb-addon-video-local-source" 							<# if(!_.isEmpty(video_aria_label)) { #>	
								aria-label=\'{{ video_aria_label }}\'
							<# } #>
							<# if(!_.isEmpty(video_aria_described_by)) { #>
							aria-describedby=\'{{ video_aria_described_by }}\'
							<# } #>
							{{(data.video_loop != 0 ? " loop" : "")}}{{(data.autoplay_video != 0 ? " autoplay" : "")}}{{(data.show_control != 0 ? " controls" : "")}}{{(data.video_mute != 0 ? " muted" : "")}}
							<# if(!_.isEmpty(video_poster.src)){
							if(video_poster.src.indexOf("http://") == -1 && video_poster.src.indexOf("https://") == -1){ #>
								poster=\'{{ pagebuilder_base + video_poster.src }}\'
							<# } else { #>
								poster=\'{{ video_poster.src }}\'
							<# }
							} #> 
							controlsList="nodownload">
							<# if(!_.isEmpty(mp4_video.src)){ #>
								<# if(mp4_video.src.indexOf("http://") == -1 && mp4_video.src.indexOf("https://") == -1){ #>
									<source src=\'{{ pagebuilder_base + mp4_video.src }}\' type="video/mp4">
								<# } else { #>
									<source src=\'{{ mp4_video.src }}\' type="video/mp4">
								<# } #> 
							<# }
							if(!_.isEmpty(ogv_video.src)){
							#>
								<# if(ogv_video.src.indexOf("http://") == -1 && ogv_video.src.indexOf("https://") == -1){ #>
									<source src=\'{{ pagebuilder_base + ogv_video.src }}\' type="video/mp4">
								<# } else { #>
									<source src=\'{{ ogv_video.src }}\' type="video/mp4">
								<# } #>
							<# } #>
							</video>
						</div>
					<# } #>
				<# } #>
	 		</div>
		';

		return $output;
	}

	/**
	 * Set embedded settings for vimeo video player
	 *
	 * @param  array 	$embeddedParameter   Array of embedded settings which will be added on vimeo player.
	 * @param  string 	$src				 "src" attribute of iframe
	 * @return void
	 * @since  4.0.8
	 */
	public static function setEmbeddedParameter($embeddedParameter, $src){
		
		$embeddedString = "";
		$separator 		= "&";	
			
		foreach ($embeddedParameter as $key => $value) {
			$embeddedString .= ($key > 0) ? $separator . $value : $value ;
		}

		$src = $src . '?' . $embeddedString;			
		return $src;
	}
}