<?php
/*
*	Este fichero es el encargado de recoger la web y mostrarla (por el camino puede comprimir y eso
*	@version 1.0.0
*	@date 2018/28/06
*
*/

//ob_start('comprimir_pagina2');
ob_start('comprimir_pagina');
function comprimir_pagina2($buffer) {
	return($buffer);
}
function comprimir_pagina($buffer) {
	
	//LazyLoad
	//Pedro 12/Septiembre/2019 ==> no hay lazy load para edge e IE:
	$user_agent = $_SERVER['HTTP_USER_AGENT'];
	//Para mac a partir de la versión 12.1 no hay problema:
	$user_agent = $_SERVER['HTTP_USER_AGENT'];
	$mostrarFoto = true;
	if (strpos($user_agent, 'Macintosh') !== false){
		$inicioVersion = strpos($user_agent, 'Version/');
		if ($inicioVersion !== false){
			$inicioVersion += strlen('Version/');
			$espacio = strpos($user_agent, ' ', $inicioVersion);
			$version = substr($user_agent, $inicioVersion, $espacio - $inicioVersion);
			$version = floatval($version);
			if ($version >= 12.1){ 
				$mostrarFoto = false;
			}
		}
	}
	if ( (strpos($user_agent, 'MSIE') === FALSE) && (strpos($user_agent, 'Edge') === FALSE) && (strpos($user_agent, 'Trident') === FALSE) && ($mostrarFoto) ){
		//Pedro 25/Julio/2019 ==> No se usa carga perezosa en un "remote request"
		if ( (_WS_LAZY_IMAGES) && (basename($_SERVER['PHP_SELF'])!= 'remote_request.php') ){
			$listaImagenes = array();
			$aguja = '<img';
			$finChar = '>';
			$ultimaPosicion = 0;
			$positions = array();
			$newBuffer = '';
			$ultimaPosicionAnterior = 0;
			
			$dom = new DOMDocument;
			$listaIDs = array();	//Lista de IDs que van a tener las imágenes que vamos a seleccionar desués
			
			while (($ultimaPosicion = strpos($buffer, $aguja, $ultimaPosicion))!== false) {
				//Antes de nada, seguimos componiendo el buffer:	
				$newBuffer .= substr($buffer, $ultimaPosicionAnterior, $ultimaPosicion - $ultimaPosicionAnterior);
				//Tenemos que buscar la imagen desde esta posición:
				$endPos = strpos($buffer, $finChar, $ultimaPosicion) + 1;
				//obtenemos la substring
				$imagen = substr($buffer, $ultimaPosicion, $endPos - $ultimaPosicion);
				

				//Aquí vamos a cambiar el <img.... >" por el nuevo:
				@$dom->loadHTML($imagen);
				$imagenes = $dom->getElementsByTagName('img');
				if (count($imagenes) > 0){
					$obImagen = $imagenes[0];
					//Necesitamos los atributos del objeto:
					$atributos = array();
					if ($obImagen->hasAttributes()) {
						$oldHtml = '';
						$newHtml = '';
						$hasID = false;
						foreach ($obImagen->attributes as $attr) {
							$nombreNodo = $attr->nodeName;
							$valorNodo = $attr->nodeValue;
							$oldHtml .= ' ' . $nombreNodo . '="' . $valorNodo . '"';
							//SI el atributo src o srcset está seteado vamos a cambiarlos por data-src y data-srcset respectivamente
							if ( ($nombreNodo == 'src') || ($nombreNodo == 'srcset') || ($nombreNodo == 'sizes') ){
								$nombreNodo = 'data-' . $nombreNodo;
							}
							$newHtml .= ' ' . $nombreNodo . '="' . $valorNodo . '"';
							if ($nombreNodo == 'id'){
								$hasID = true;
								//$listaIDs .= ( ($listaIDs != '') ? ',' : '') . '#' . $valorNodo;
								$listaIDs[] = $valorNodo;
							}
						}
						//Si no tiene ID, nosotros le añadimos una:
						if (!$hasID){
							$newID =  uniqid();
							//$listaIDs .= ( ($listaIDs != '') ? ',' : '') . '#' . $newID;
							$listaIDs[] = $newID;
							$newHtml .= ' id="' . $newID . '"';
							$oldHtml .= ' id="' . uniqid() . '"';
						}
					}
					$newHtml = '<img' . $newHtml . '" ' . '" src="' . Theme::findFile('loading.gif', false, true) . '">';
					$oldHtml = '<noscript><img' . $oldHtml . '></noscript>';
					$newBuffer .= $newHtml . $oldHtml;
					//Por último vamos a reemplazar en el buffer las ocurrencias del html original por el nuevo:
					//$buffer = str_replace($imagen, $newHtml . $oldHtml, $buffer);
				}
				
				
				
				//Para agilizar la búsqueda, vamos a avanzar "ultimaPosicion":
				$ultimaPosicionAnterior = $ultimaPosicion = $endPos;
			}
			
			//Nos falta añadir el resto:
			$newBuffer .= substr($buffer, $ultimaPosicionAnterior);


			//Vamos a añadir el javascript:
			$functionName = 'jsf' . uniqid();
			$functionObserve = 'jsf' . uniqid();
			$imgObserver = 'jsf' . uniqid();
			$newBuffer .= '<script>
				document.addEventListener(\'WSLE\', function(event) {
					function ' . $functionObserve . '(element, imgObserver){
						var retorno = false;
						if (element != null){
							imgObserver.observe(element);
							retorno = true;
						}else{
							/*console.log(element);*/
						}
						return(retorno);
					}
					function ' . $functionName . '(entries, observer) {
						for (var i = 0; i < entries.length; i++) {
							var io = entries[i];
							if (io.isIntersecting && io.intersectionRatio > 0) {
								var image = io.target,
									src = image.getAttribute("data-src"),
									srcSet = image.getAttribute("data-srcset");
								if (srcSet) {
									image.setAttribute("srcset", srcSet);
								}
								if (src) {
									image.setAttribute("src", src);
								}
								/* Stop watching and load the image*/
								observer.unobserve(io.target);
							}
						}
					}
					var ' . $imgObserver . ' = new IntersectionObserver(' . $functionName . ', 
						{
							/* If the image gets within 50px in the Y axis, start the download.*/
							rootMargin: \'50px 0px\',
							threshold: 0.1
						}
					);';
					//Vamos a hacerlo por cada ID
					foreach($listaIDs as $kew => $id){
						$newBuffer .= ' var cosa = ' . $functionObserve . '(document.getElementById(\'' . $id . '\'), ' . $imgObserver . ');';
					}
					$newBuffer .= '
				});			
			</script>';
			$buffer = $newBuffer;

		}
	}
	
	if (_WS_ACTIVE_TRADUCTION){
		//Vamos a traducir:
		$buffer = Traduccion::aplyPhraseList($buffer);
	}
	
	//Pedro 23/Octubre/2019 ==> La minificación la hacemos al final:
	//Compresión y minificación del html 
	
	if (_WS_COMPRESS_FULL){
		//Esta línea que viene aquí la pongo para hacer unas pruebas
		//Cambiamos a una funcion anonima
		
		//$busca = array('/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s');
		//$reemplaza = array('>','<','\\1');
		//return preg_replace($busca, $reemplaza, $buffer);
		//return preg_replace(' //', '', $buffer);
		//return preg_replace("/t", '', $buffer);
		$buffer = preg_replace('#^\s*//.+$#m', "", $buffer);			//Comentarios javascript en una sóla línea, observar que puede dar falsos positivos
		$buffer = preg_replace('!/\*.*?\*/!s', '', $buffer);			//Comentarios de javascript
		$buffer = preg_replace('/\n\s*\n/', "\n", $buffer);				//Líneas vacías
		$buffer = preg_replace('/    /', '', $buffer);	//Espacios extra
		$buffer = preg_replace('/[\t]/', '', $buffer);	//Tabulaciones
		//$buffer = preg_replace('/<!--(.|\s)*?-->/', 'a', $buffer);	//Comentarios de html
		$buffer = preg_replace('/<!--[\s\S]*?-->/', '', $buffer);	//Comentarios de html
		
		//$buffer = preg_replace('/\n\n/', "\n", $buffer);
		$buffer = preg_replace('/\n/', '', $buffer);				//Saltos de línea
		$buffer = preg_replace('[ /]', '/', $buffer);				//Este no lo tengo claro
	}
	
	//Si estamos conectados a la BD nos desconectamos:
	$bd = new BaseDatos();
	if ($bd->isConectado()){
		BaseDatos::closeConexion();
	}
	return($buffer);
}