<?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_pagina');

function comprimir_pagina($buffer) {
	
	//Compresión y minificación del html 
	if (_WS_COMPRESS_FULL){
		//$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('/    /', '', $buffer);
		$buffer = preg_replace('/[\t]/', '', $buffer);
		$buffer = preg_replace('/<!--(.|\s)*?-->/', '', $buffer);
		//$buffer = preg_replace('/\n\n/', "\n", $buffer);
		$buffer = preg_replace('/\n/', '', $buffer);
		$buffer = preg_replace('[ /]', '/', $buffer);
	}

	//LazyLoad
	//Pedro 12/Septiembre/2019 ==> no hay lazy load para edge e IE:
	$user_agent = $_SERVER['HTTP_USER_AGENT'];
	if ( (strpos($user_agent, 'MSIE') === FALSE) && (strpos($user_agent, 'Edge') === FALSE) && (strpos($user_agent, 'Trident') === FALSE) ){
		//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="' . Shop::$configuracion->url. _WS_THEMES_DIR_ . _WS_THEME_DIR_ . _WS_THEME_HTML_DIR_ . 'images/loading.gif">';
					$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 . ');
						if (!cosa){
							//console.log(\'document.getElementById(\\\'' . $id . '\\\')\');
						};';
					}
					$newBuffer .= '
				});			
			</script>';
			$buffer = $newBuffer;

		}
	}
	
	if (_WS_ACTIVE_TRADUCTION){
		//Vamos a traducir:
		$buffer = Traduccion::aplyPhraseList($buffer);
	}
	
	return($buffer);
}