<?php

//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

?>

<script>

var identificadores_v1=new Array();
	
// array('codigo'=>'00','etiqueta'=>'Id Palet Cliente','longitud_minima'=>18,'longitud_maxima'=>18,'tipo'=>'n'),
<?php foreach(unserialize(GS1_128_CODES) as $item) { ?>
identificadores_v1.push( { 'codigo':'<?php echo $item['codigo']; ?>','etiqueta':'<?php echo $item['etiqueta']; ?>','longitud_minima':<?php echo $item['longitud_minima']; ?>,'longitud_maxima':<?php echo $item['longitud_maxima']; ?>,'tipo':'<?php echo $item['tipo']; ?>' } );
<?php } ?>

var identificadores_v2=new Array();

<?php foreach(unserialize(GS1_128_CODES_ALTERNATIVO) as $item) { ?>
identificadores_v2.push( { 'codigo':'<?php echo $item['codigo']; ?>','etiqueta':'<?php echo $item['etiqueta']; ?>','longitud_minima':<?php echo $item['longitud_minima']; ?>,'longitud_maxima':<?php echo $item['longitud_maxima']; ?>,'tipo':'<?php echo $item['tipo']; ?>' } );
<?php } ?>

var identificadores=identificadores_v1;


//Esta funcion sirve para el segundo barrido, para los identificadores alternativos. El codigo 235 puede tener dos longitudes segun el standard de FNMT
function alternarIdentificadores() {
	if(identificadores==identificadores_v1) identificadores=identificadores_v2;
	else identificadores=identificadores_v1;
}

/*
/////////// EJEMPLO TRATAMIENTO SEGUNDO BARRIDO
if(lecturaFinal.indexOf('error')!=-1) {
				
	if(identificadores==identificadores_v1) identificadores=identificadores_v2;
	else identificadores=identificadores_v1;
	
	lecturaFinal=limpiaLecturaDesdeScanner( lecturaScanner );
	
	if(identificadores==identificadores_v1) identificadores=identificadores_v2;
	else identificadores=identificadores_v1;
	
}
*/


function compruebaIdentificadoresSustituyePorCortes(cadena) {

	//console.log('TTT NUEVA FUNCION PARA SACAR IDEENTIFICADORES CON PARENTESIS');

	var resultado=cadena;

	//para cada identificador
	
	for(var i=0;i<identificadores.length;i++) {
	
		var codigo=identificadores[i]['codigo'];
		var codigoFinal;
		var codigoConParentesis;
		var longitudCodigo;
		var posicion=-1;
		
		//console.log('Identificador: '+codigo);
		
		if(codigo.indexOf('n')!=-1) {
		//if(false) {
		
			//console.log('Se intenta encontrar un identificador con decimales');
			
			for(var j=0;j<=9;j++) {
				
				var codigoFinal=codigo.replace('n',j);
				var codigoConParentesis='('+codigoFinal+')';
				longitudCodigo=codigoConParentesis.length;
				posicion=resultado.indexOf(codigoConParentesis);
				
				if(posicion>-1) break;
				
			}
			
		}
		else {
		
			codigoFinal=codigo;
			codigoConParentesis='('+codigoFinal+')';
			longitudCodigo=codigoConParentesis.length;
			posicion=resultado.indexOf(codigoConParentesis);
			
		}
		
		if(posicion>-1) {
		
			//console.log('Encontrado '+codigoConParentesis+' en la posicion: '+posicion);
		
			resultado=resultado.substring(0,posicion)+'#'+codigoFinal+resultado.substring(posicion+longitudCodigo,resultado.length);
			
			//console.log('Resultado ahora: '+resultado);
			
		}
		
	}
	
	return resultado;

}


function compruebaIdentificadorParaCortar(cadena,posicion) {

	var cadenaEvaluar=cadena.substring(posicion,cadena.length);
	var resultado='';

	//para cada identificador, miramos si está al principio de la cadena
	
	for(var i=0;i<identificadores.length;i++) {
	
		var codigoOriginal=identificadores[i]['codigo']
		var codigo='('+codigoOriginal+')';
		var longitudCodigo=codigo.length;
		var coincidencia=false;
		var traza=0;
		
		if( identificadores[i]['codigo']=='235' ) traza=1;
		else traza=0;
		
		//console.log('Evaluamos: '+codigo);
		
		if(traza) {
			
			//console.log('Longitud: '+longitudCodigo);
		}
		
		for(var j=0;j<longitudCodigo;j++) {
			if(traza) //console.log('Posicion: '+j);
			if( cadena[posicion+j]==codigo[j] || codigo[j]=='n' ) coincidencia=true;
			else coincidencia=false;
		}
		
		if(coincidencia) {
		
			//console.log('busqueda identificador encontrado: '+codigo);
			
			resultado=codigoOriginal;
			
			break;
			
		}
		
	}
	
	return resultado;

}

var caracterCorchete=<?php if($caracterDataMatrix) echo $caracterDataMatrix; else echo "''"; ?>;
var caracterEspecialSeparador=<?php if($caracterEspecialSeparador) echo $caracterEspecialSeparador; else echo "''"; ?>;
var caracterShift=16;
var caracterControl=17;
var caracterAltGraph=18;
var caracterEnter=13;
var caracterJota=74;
var caracterCapsLock=20;

var caracterCorcheteWindows=187;

function caracterEspecial(charCode) {
	var valor='';
	if (charCode == 186) valor=";"; // semi-ccaracterCorcheteolon
	if (charCode == 187) valor="="; // equal-sign
	if (charCode == 188) valor=","; // comma
	if (charCode == 189) valor="-"; // dash
	if (charCode == 190) valor="."; // period
	if (charCode == 191) valor="/";  // forward slash
	if (charCode == 192) valor="`"; // grave accent
	if (charCode == 219) valor="["; // open bracket
	if (charCode == 220) valor="\\"; // back slash
	if (charCode == 221) valor="]"; // close bracket
	if (charCode == 222) valor="'"; // single quote
	return valor;
}

function formateaBloqueConParentesis(bloque) {

	////console.log('Bloque: '+bloque);

	var devolucion='';	////console.log('Analisis bloque para poner parentesis: '+bloque);
	
	//Hacemos una búsqueda para cada identificador de la constante GS1_128_CODES
	for(var i=0;i<identificadores.length;i++) {	////console.log('Evaluamos identificador: '+identificadores[i]['codigo']);
	
		var coincidencia=false;
		var longitud=identificadores[i]['codigo'].length;
		
		//Leemos los primeros caracteres del bloque, según la longitud del identificador, para ver si lo encontramos
		//if( bloque.substr(0,longitud)==identificadores[i]['codigo'] ) {
		if( bloque.substr(0,longitud)==identificadores[i]['codigo'] || ( bloque.substr(0,longitud-1)==identificadores[i]['codigo'].substr(0,longitud-1) && identificadores[i]['codigo'].charAt(longitud-1)=='n' ) ) {
		
			////console.log('Encontrado: '+identificadores[i]['codigo']);
			////console.log('longitud bloque: '+bloque.length);
			////console.log('longitud id: '+longitud);
			////console.log('longitud minima: '+identificadores[i]['longitud_minima']);
			////console.log('longitud maxima: '+identificadores[i]['longitud_maxima']);
		
			//Comprobación de la longitud
			if( bloque.length<longitud+identificadores[i]['longitud_minima'] || bloque.length>longitud+identificadores[i]['longitud_maxima'] ) devolucion='error';
			else devolucion='('+bloque.substr(0,longitud)+')'+bloque.substr(longitud,bloque.length);	////console.log('Se devuelve formateado como: '+devolucion);

			break;
		}
	}
	
	////console.log('DEVOLUCION FINAL: '+devolucion);
	
	if(devolucion) return devolucion;
	else return 'error';
    
}

function pintaLecturaHumana(lectura,barridoAlternativo=false){

	////console.log('comienzo proceso pintaLecturaHumana con la lectura: '+lectura);
	
	if(barridoAlternativo) alternarIdentificadores(); //Alternamos al bloque de ids alterantivos, porque es segundo barrido

	var error=false;
	var cadenaFinal='';
	var bloqueFormateado='';
	var bloques=lectura.split('#');
	
	for(var i=0;i<bloques.length;i++) {
		
		if(bloques[i]!='') {
		
			bloqueFormateado=formateaBloqueConParentesis(bloques[i]);
			if(bloqueFormateado=='error') {
				error=true;
				break;
			}
			else cadenaFinal+=bloqueFormateado;
			////console.log('bloque '+i+' : '+bloqueFormateado);
		
		}
	}
	////console.log('Cuantos bloques con # detectados: '+bloques.length);
	////console.log('Resultado del formateo: '+cadenaFinal);
	
	//20-1-2020 Añadimos la excepción del núm de palet (00)+18 chars que debe ser válido
	if( cadenaFinal.includes('(00)') && cadenaFinal.length==22 ) esLecturaGS1Correcta=true;
	
	if(barridoAlternativo) alternarIdentificadores(); //Volvemos al bloque de ids original
	
	if(error) {
		if(!barridoAlternativo) {
			return pintaLecturaHumana(lectura,true); //Volvemos a llamar a la misma función, pero pidiendo el barrido alternativo
		}
		else {
			return 'error';
		}
	}
	else {
	
		////console.log('esLecturaGS1Correcta: '+esLecturaGS1Correcta);
		////console.log('logitud bloques: '+bloques.length);
	
		//26-12-2019 Comprobar si es un gs1-128 detectado correctamente con caracteres de control
		// o que es un dato único, pero según los tipos de datos y longitudes, podría ser correcto
		if(esLecturaGS1Correcta || bloques.length>1) return cadenaFinal;
		else return lectura;
	}
}

function extraeCaracteresDirectos(lectura) {

	var resultado='';

	for(var i=0;i<lectura.length;i++) {
		nuevaLinea='Caracter: '+lectura[i]+' / ASCII: '+lectura.charCodeAt(i)+'\n';
		resultado+=nuevaLinea;
	}
	
	return resultado;
}

function pintaTraza(traza) {

	var original=$("#lecturaReal").val();
	$("#lecturaReal").val( original+'\n'+traza );

}

function extraeBloquesSinSeparadorCaracterSeparador(bloque,caracterSeparador) {
	
	//console.log('>>>>>>> BLOQUE: '+bloque);
	
	var devolucion='';
	
	//Hacemos una búsqueda para cada identificador de la constante GS1_128_CODES
	for(var i=0;i<identificadores.length;i++) {
	
		var coincidencia=false;
		var longitud=identificadores[i]['codigo'].length;
		
		//Leemos los primeros caracteres del bloque, según la longitud del identificador, para ver si lo encontramos
		
		if( bloque.substr(0,longitud)==identificadores[i]['codigo'] || ( bloque.substr(0,longitud-1)==identificadores[i]['codigo'].substr(0,longitud-1) && identificadores[i]['codigo'].charAt(longitud-1)=='n' ) ) {
			
			//console.log('>>>>>>> Se ha encontrado identificador: '+identificadores[i]['codigo']);
			
			if( identificadores[i]['longitud_minima']==identificadores[i]['longitud_maxima'] ) { //Es un identificador de longitud fija
				
				////console.log('Es identificador de longitud fija');
				
				devolucion = bloque.substr(0,longitud+identificadores[i]['longitud_minima']) + '#';
				
				//pintaTraza('Devolucion de dato longitud fija: '+devolucion);
				
				var siguienteTrozo=bloque.substr(longitud+identificadores[i]['longitud_minima']+1,bloque.length);
				
				//console.log('El bloque actual es: '+bloque);
				//console.log('Longitud de la devolucion: '+devolucion.length);
				//console.log('Longitud del bloque: '+bloque.length);
				//console.log('Siguiente trozo sacado del separador: '+siguienteTrozo);
				
				
				//pintaTraza('El primer caracter del siguiente trozo es: '+siguienteTrozo.charCodeAt(0));
				//Se han encontrado etiquetas con separador tras campo de longitud fija
				if(siguienteTrozo.charCodeAt(0)==caracterSeparador) {
					//pintaTraza('Se ha detectado que hay un caracter separador donde no debería haberlo');
					siguienteTrozo=siguienteTrozo.substr(1,siguienteTrozo.length-1);
					//pintaTraza('Siguiente trozo obviando el separador incorrecto: '+siguienteTrozo);
				}
				
				if(siguienteTrozo.length) {
					//console.log('El siguiente trozo tiene longitud: '+siguienteTrozo);
					devolucion+=extraeBloquesSinSeparadorCaracterSeparador(siguienteTrozo,caracterSeparador);
					
				}
			}
			else { //no es un bloque de longitud fija, recorremos hasta encontrar el caracter separador
			
				//console.log('>>>>Es identificador de longitud variable. Tenemos que buscar el separador siguiente');
				
				//var separacion=bloque.indexOf(caracterSeparador);
				var separacion;
				
				for(var i=0;i<bloque.length;i++) {
					//pintaTraza('     Caracter: '+bloque[i]+' ascii: '+bloque.charCodeAt(i));
					if(bloque.charCodeAt(i)==caracterSeparador) { separacion=i; break; }
				}
				
				if(i==bloque.length) separacion=i;
				
				//pintaTraza('>>>>El caracter separador '+caracterSeparador+' está en la posición '+separacion);
				
				if(separacion!=-1) {
					devolucion = bloque.substr(0,separacion) + '#';
					//pintaTraza('Devolucion de dato longitud variable: '+devolucion);
					var siguienteTrozo=bloque.substr(devolucion.length,bloque.length);
					
					//pintaTraza('El bloque actual es: '+bloque);
					//pintaTraza('Longitud de la devolucion: '+devolucion.length);
					//pintaTraza('Longitud del bloque: '+bloque.length);
					//pintaTraza('Siguiente trozo sacado del separador: '+siguienteTrozo);
					
					if(siguienteTrozo.length) {
						devolucion+=extraeBloquesSinSeparadorCaracterSeparador(siguienteTrozo,caracterSeparador);
					}
				}
				else devolucion = bloque; //No se ha encontrado separador, es el ultimo bloque
				
				
			}
			
			
			
			break;
		}
	}
	
	if(devolucion) return devolucion;
	else return 'error';

}




function extraeBloquesSinSeparador(bloque) {	////console.log('Busqueda de bloques no separados en: '+bloque);
	
	//console.log('function extraeBloquesSinSeparador(bloque)');
	//console.log('BLOQUE: '+bloque);
	
	if(bloque=='#0105420067727507#800825021215') //console.log('@@@@@@@@@@@@@@@@@@@@@@@ TRAZA');
	
	var devolucion='';
	
	//Hacemos una búsqueda para cada identificador de la constante GS1_128_CODES
	for(var i=0;i<identificadores.length;i++) {
	
		var coincidencia=false;
		var longitud=identificadores[i]['codigo'].length;
		
		//Leemos los primeros caracteres del bloque, según la longitud del identificador, para ver si lo encontramos
		
		if( bloque.substr(0,longitud)==identificadores[i]['codigo'] || ( bloque.substr(0,longitud-1)==identificadores[i]['codigo'].substr(0,longitud-1) && identificadores[i]['codigo'].charAt(longitud-1)=='n' ) ) {
			
			//console.log('--oOo--');
			//console.log('Se ha encontrado identificador: '+identificadores[i]['codigo']);
			
			
			if( identificadores[i]['longitud_minima']==identificadores[i]['longitud_maxima'] ) { //Es un identificador de longitud fija
				
				//console.log('Es identificador de longitud fija ----- '+identificadores[i]['longitud_minima']+' / '+identificadores[i]['longitud_maxima']);
				
				devolucion = bloque.substr(0,longitud+identificadores[i]['longitud_minima']) + '#';
				
				//console.log('Devolucion: '+devolucion);
				
				var siguienteTrozo=bloque.substr(longitud+identificadores[i]['longitud_minima'],bloque.length);
				if(siguienteTrozo.length) {
					////console.log('Siguiente trozo: '+siguienteTrozo);
					devolucion+=extraeBloquesSinSeparador(siguienteTrozo);
				}
			}
			else { //no es un bloque de longitud fija, con lo que será el último del bloque
				//console.log('No es un bloque de longitud fija, con lo que será el último del bloque');
				//console.log('lo que se devuelve es: '+bloque);
				devolucion = bloque;
			}
			
			break;
		}
	}
	
	if(devolucion) return devolucion;
	else return 'error';

}



function limpiaLecturaDesdeScanner(lectura,barridoAlternativo=false){

	if(barridoAlternativo) {
		//console.log('#####################	SEGUNDO BARRIDO CON CODIGOS ALTERNATIVOS ################');
		alternarIdentificadores(); //Alternamos al bloque de ids alterantivos, porque es segundo barrido
	}

	////console.log('Comienzo del proceso limpiaLecturaDesdeScanner para la lectura: '+lectura);

	//NOTA: lectura es un array que contiene en [0] la tecla gráfica y en el [1] el código de tecla pulsada
	//		en el [2] metemos otro tipo de tecla pulsada tipo "nombre" de tecla
	//      por eso unas veces miramos un valor y otras, otro
	
	var cadenaLectura='';
	var siguientePosicion=0;
	
	//Primero eliminamos todos los caracteres shift
	
	var lecturaTemp=new Array();
	for(var i=0;i<lectura.length;i++) if(lectura[i][1]!=caracterShift) lecturaTemp.push(lectura[i]); ///####################### 2-10-2024 AQUI SE SALTA TODOS LOS SHIFT //////////
	lectura=lecturaTemp;

	////console.log('CONTROL PRIMEROS CARACTERES');
	////console.log(lectura[0]);
	////console.log(lectura[1]);

	//Validacion que congenga ctrl+j suciedad de una lectura anterior
	while( lectura[siguientePosicion][1]==caracterControl && ( lectura[siguientePosicion+1][0]=='J' || lectura[siguientePosicion+1][0]=='j' || lectura[siguientePosicion+1][1]==caracterJota ) ) { 
		siguientePosicion+=2;
	}
	
	//Validacion que el scanner esté configurado en Español. En las lectura Gs1 pone un control+altgraph delante
	if( lectura[0][1]==caracterControl && lectura[1][1]==caracterAltGraph ) { 
		siguientePosicion+=2;
	}
	
	

	//Validacion que contenga los caracteres de inicio que definen el GS1-128 de 2D y 1D
	
	if( (lectura[siguientePosicion][1]==caracterCorchete && lectura[siguientePosicion+1][0]=='D' && lectura[siguientePosicion+2][0]=='2') || (lectura[siguientePosicion][1]==caracterCorchete && lectura[siguientePosicion+1][0]=='C' && lectura[siguientePosicion+2][0]=='1') ) {
		siguientePosicion+=3;
		esLecturaGS1Correcta=true;
	}
	

	//22-07-2022 Unitech nos manda una forma de programar el MS925 con una secuencia de codigos.
	//Validacion especial MS925 mete unos shifts entre medias
	if( (lectura[siguientePosicion][1]==caracterCorchete && lectura[siguientePosicion+1][0]==caracterShift && lectura[siguientePosicion+2][0]=='D' && lectura[siguientePosicion+3][0]=='2') || (lectura[siguientePosicion][1]==caracterCorchete && lectura[siguientePosicion+1][0]==caracterShift && lectura[siguientePosicion+2][0]=='C' && lectura[siguientePosicion+3][0]=='1') ) {
		siguientePosicion+=4;
		esLecturaGS1Correcta=true;
	}

	
	//Validacion especial FM logistics, los primeros dos caracteres son un CapsLock y un Shift
	if( lectura[0][1]==caracterCapsLock && lectura[1][1]==caracterShift ) { 
		siguientePosicion+=2;
		esLecturaGS1Correcta=true;
	}
	
	
	//07-03-2025 SI LA CADENA COMIENZA CON UN CAPSLOCK MAYUSCULAS LA BORRAMOS
	if( lectura[0][1]==caracterCapsLock) {
		siguientePosicion+=1;
	}
	
	
	//Validacion especial Bayport para un lector que no envía los primeros caracteres del gs1-128
	<?php if($gs1SinCaracteresInicio) { ?>
	esLecturaGS1Correcta=true;
	<?php } ?>
	
	//console.log('HASTA AQUI HEMOS LLEGADO');
	
	//Se recorre toda la cadena de lectura para identificar los cortes entre bloques de datos
	
	for(var i=siguientePosicion;i<lectura.length;i++) {
		
		////console.log('caracter -> '+lectura[i][0]+' / '+lectura[i][1]+' / '+lectura[i][2]);
		
		if(lectura[i][1]==caracterEnter || lectura[i][2]=='Enter') break; //Fin de lectura
		else {
		
			//console.log('$$$$ CONTROL CORTES $$$$');
			
			var tipoCorte1=(lectura[i][1]==caracterControl && lectura[i+1][1]==caracterCorcheteWindows);
			var tipoCorte2=(lectura[i][1]==caracterControl && lectura[i+1][1]==caracterCorchete);
			var tipoCorte3=(lectura[i][1]==caracterControl && lectura[i+1][1]==caracterAltGraph && lectura[i+2][1]==caracterCorchete);
			var tipoCorte4=(lectura[i][1]==caracterEspecialSeparador);
			var tipoCorte5=(lectura[i][1]==caracterControl && lectura[i+1][1]==caracterShift && lectura[i+2][1]==caracterAltGraph);
			var tipoCorte6=(lectura[i][1]==caracterCorchete);
			var tipoCorte7=(lectura[i][1]==caracterAltGraph && lectura[i+1][1]==96 && lectura[i+2][1]==98 && lectura[i+3][1]==105);
			
			if ( tipoCorte1 || tipoCorte2 || tipoCorte3 || tipoCorte4 || tipoCorte5 || tipoCorte6 || tipoCorte7 ) {
			
			//if ( (lectura[i][1]==caracterControl && lectura[i+1][1]==caracterCorcheteWindows) || (lectura[i][1]==caracterControl && lectura[i+1][1]==caracterCorchete) || (lectura[i][1]==caracterControl && lectura[i+1][1]==caracterAltGraph && lectura[i+2][1]==caracterCorchete) || (lectura[i][1]==caracterEspecialSeparador) || (lectura[i][1]==caracterControl && lectura[i+1][1]==caracterShift && lectura[i+2][1]==caracterAltGraph) || lectura[i][1]==caracterCorchete || (lectura[i][1]==caracterAltGraph && lectura[i+1][1]==96 && lectura[i+2][1]==98 && lectura[i+3][1]==105) ) {
				
				//console.log('Encontrado corte');
				//console.log('Tipo corte encontrado: 1 : '+tipoCorte1+' / 2: '+tipoCorte2+' / 3: '+tipoCorte3+' / 4: '+tipoCorte4+' / 5: '+tipoCorte5+' / 6: '+tipoCorte6+' / 7: '+tipoCorte7);
				//console.log( lectura[i][1] + ' --- ' + lectura[i+1][1] + ' --- ' + lectura[i+2][1] + ' --- '+lectura[i+3][1] );
				
				
				if( cadenaLectura.slice(-1) != '#' ) cadenaLectura+='#';
				
				//16-10-204 detectamos un alt+`bi (codigos 18,96,98 y 105) que separan el (235) UpUI del (01) GTIN en los codigo super raros de puros de LTC
				if (lectura[i][1]==caracterAltGraph && lectura[i+1][1]==96 && lectura[i+2][1]==98 && lectura[i+3][1]==105) i=i+3;
			}
			else {
				////console.log('El caracter que se evalua es: '+lectura[i][1]);
				//if( lectura[i][1]!=caracterCorcheteWindows && lectura[i][1]!=caracterCorchete && lectura[i][1]!=caracterAltGraph ) {
				if( lectura[i][1]!=caracterCorchete && lectura[i][1]!=caracterAltGraph ) {
					//16-10-204 quito la lectura de la tabla de caracters especiales porque ahora cogemos de [i][2] que contiene el literal
					/*
					if(caracterEspecial(lectura[i][1])) cadenaLectura+=caracterEspecial(lectura[i][1]);
					else {
						//cadenaLectura+=lectura[i][0]; ///####################### 2-10-2024 AQUI COGE EL VALOR 0 DE PULSACION, QUE ES SIEMPRE MAYUSCULAS //////////
						cadenaLectura+=lectura[i][2];
						//console.log('Cadena lectura en este punto: '+cadenaLectura);
					}
					*/
					cadenaLectura+=lectura[i][2];
					////console.log('Cadena lectura en este punto: '+cadenaLectura);
				}
			}
		}
	}
	//console.log('Cadena de lectura inicial cortada con los cortes incluidos en el codigo:  '+cadenaLectura);
		
	//console.log('Para cada bloque, tenemos que identificar -a su vez- posibles bloques internos no cortados');
		
	var bloquesTemporales=cadenaLectura.split('#');
	cadenaLectura='';
		
	for(var i=0;i<bloquesTemporales.length;i++) {
		if(cadenaLectura) cadenaLectura+='#';
		//console.log('La cadena lectura es en este punto: '+cadenaLectura);
		if(bloquesTemporales[i]) cadenaLectura+=extraeBloquesSinSeparador(bloquesTemporales[i]);
	}

	//console.log('Fin del proceso de identificar los bloques no cortados. esLecturaGS1Correcta: '+esLecturaGS1Correcta);

	//Si el último caracter es # se borra
	if(cadenaLectura.substring(cadenaLectura.length,1)=='#') cadenaLectura=cadenaLectura.substring(0,cadenaLectura.length-1);

	//18-10-2024 hay TTT que no son GS1 pero pueden serlo (unidades)
	if(!esLecturaGS1Correcta) {
		//console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
		//temp=compruebaIdentificadoresSustituyePorCortes(cadenaLectura);
		//temp=extraeBloquesSinSeparador(cadenaLectura);
		temp=extraeBloquesSinSeparadorCaracterSeparador(cadenaLectura,'#');  //07-03-2025
		//console.log('============================== Temporal lectura si no es lectura correcta: '+temp);
		
		if(temp.indexOf('error')==-1) {
			//console.log('============================== No tiene error, así que es lectura gs1 correcta.');
			esLecturaGS1Correcta=true;
		}
	}

	//console.log('CADENA LECTURA FINAL --> '+cadenaLectura);

	//console.log('Es lectura GS1-128 correcta: '+esLecturaGS1Correcta);
	
	
	if(barridoAlternativo) alternarIdentificadores(); //Volvemos a los identificadores originales
	
	if(!esLecturaGS1Correcta && !barridoAlternativo) {
		//console.log('-------------------------------- Se lanza un segundo barrido con códigos alternativos, porque ha dado error');
		return limpiaLecturaDesdeScanner(lectura,true); //Volvemos a llamar a la misma función, pero pidiendo el barrido alternativo
	}
	else return cadenaLectura;

	
	
}

function limpiaLecturaDesdeScannerNoGS1(lectura){

	//NOTA: lectura es un array que contiene en [0] la tecla gráfica y en el [1] el código de tecla pulsada
	//      por eso unas veces miramos un valor y otras, otro
	
	var cadenaLectura='';
	var siguientePosicion=0;
	
	//Primero eliminamos todos los caracteres shift
	
	var lecturaTemp=new Array();
	for(var i=0;i<lectura.length;i++) if(lectura[i][1]!=caracterShift) lecturaTemp.push(lectura[i]);
	lectura=lecturaTemp;

	//Validacion que congenga ctrl+j suciedad de una lectura anterior
	while( lectura[siguientePosicion][1]==caracterControl && ( lectura[siguientePosicion+1][0]=='J' || lectura[siguientePosicion+1][0]=='j' || lectura[siguientePosicion+1][1]==caracterJota ) ) { 
		siguientePosicion+=2;
	}

	for(var i=siguientePosicion;i<lectura.length;i++) {
		//if(lectura[1][1]==caracterEnter) break; //Fin de lectura
		if(lectura[i][1]==caracterEnter || lectura[i][2]=='Enter') break; //Fin de lectura
		else {
			if(lectura[i][1]==caracterControl && lectura[i+1][1]==caracterCorchete) cadenaLectura+='#';
			else {
				if(lectura[i][1]!=caracterCorchete) {
					//16-10-204 quito la lectura de la tabla de caracters especiales porque ahora cogemos de [i][2] que contiene el literal
					//if(caracterEspecial(lectura[i][1])) cadenaLectura+=caracterEspecial(lectura[i][1]);
					//else cadenaLectura+=lectura[i][0];
					cadenaLectura+=lectura[i][2];
				}
				else { //Es una lectura con codificion de inicio tipo ]d1 o +d1
					i=i+2;
				}
			}
		}
	}

	return cadenaLectura;
}



function transformaLecturaManualAlFormatoScanner(lectura) {

	//console.log('TRAZA TTT 2: transformaLecturaManualAlFormatoScanner');
	
	//console.log(lectura);
	
	var resultado='';
	var lecturaEvaluar=lectura;
	
	resultado=compruebaIdentificadoresSustituyePorCortes(lectura);
	
	/*
	for(var i=0;i<lectura.length;i++) {
		////console.log('TRAZA evaluamos posicion '+i+' de la lectura original');
		if(lectura[i]=='(') {
			var temp='';
			temp=compruebaIdentificadorParaCortar(lectura,i);
			if(temp!='') {
				//console.log('TRAZA se ha encontrado identificador: '+temp);
				resultado+='#'+temp;
				i=temp.length;
			}
			else resultado+=lectura[i];
		}
		else resultado+=lectura[i];
	}
	*/
	
	/*
	for(var i=0;i<lectura.length;i++) {
		if(lectura[i]=='(') {
			if(resultado!='') resultado+='#'
		}
		else if(lectura[i]!=')') resultado+=lectura[i];
	}
	*/
	
	//console.log('RESULTADO DE EXTRAER DE ESCRITURA MANUAL: '+resultado);
	
	return resultado;
	
}

function gs1ValidoConTTT(cadena) {

	////console.log('cadena comprobacion TTT:'+cadena);
	var validacion;
	validacion=( ( cadena.includes('(01)') &&  cadena.includes('(21)') ) || ( cadena.includes('(00)') ) || ( cadena.includes('(235)') &&  cadena.includes('(01)') ) || ( cadena.includes('(8008)') ) || ( cadena.includes('(235)') &&  cadena.includes('(01)') ) );
	return ( validacion );

}

function extraeValorIdentificador(lectura,valor) {

	var bloques=lectura.split('(');
	var resultado='';
	
	for(var i=0;i<bloques.length;i++) {
		var partes=bloques[i].split(')');
		if(partes[0]==valor) {
			resultado=partes[1];
			break;
		}
	}
	
	if(resultado!='') return resultado;
	else return valor;

}



// FUNCIONES NO-GS1 --> SON PARA PRECINTAS

function limpiaLecturaDesdeScannerPrecinta(lectura){

	var cadenaLectura='';
	var siguientePosicion=0;
	
	//Primero eliminamos todos los caracteres shift
	
	var lecturaTemp=new Array();
	for(var i=0;i<lectura.length;i++) if(lectura[i][1]!=caracterShift) lecturaTemp.push(lectura[i]);
	lectura=lecturaTemp;
	
	var encontradoInicio=false;

	for(var i=siguientePosicion;i<lectura.length;i++) {
		////console.log(lectura[i]);
		if(lectura[i][1]==caracterEnter || lectura[i][2]=='Enter'){
			break; //Fin de lectura
		}
		//else if( lectura[i][1]==caracterControl && lectura[i+1][1]==caracterJota ) {
		//	i=i+2;
		//}
		else if( lectura[i][0]=='H' && lectura[i+1][0]=='T' && lectura[i+2][0]=='T' && lectura[i+3][0]=='P' ) {
			encontradoInicio=true;
			i=i+7;
		}
		else if(encontradoInicio) {
			cadenaLectura+=lectura[i][0];
		}
		else {
			i++;
		}
	}

	return cadenaLectura;
}

function extraePrecintaDeURL(valor) {

	var precinta='';

	//if( valor.substr(0,57)=="HTTPS¾77WWW2¾AGENCIATRIBUTARIA¾GOB¾ES7WLPL7ADMF½JDIT7VÛC0" || valor.substr(0,57)=="HTTPSÀ½½WWW2¾AGENCIATRIBUTARIA¾GOB¾ES½WLPL½ADMFÛJDIT½V½CÝ" || valor.substr(0,57)=="HTTPSº¿¿WWW2¾AGENCIATRIBUTARIA¾GOB¾ES¿WLPL¿ADMF½JDIT¿V¿C»" || valor.substr(0,57)=="HTTPS¾77WWW2¾AGENCIATRIBUTARIA¾GOB¾ES7WLPL7ADMF¿JDIT7V½C0" ) {
	if(
		valor.substr(0,49)=="WWW2¾AGENCIATRIBUTARIA¾GOB¾ES7WLPL7ADMF½JDIT7VÛC0" ||
		valor.substr(0,49)=="WWW2¾AGENCIATRIBUTARIA¾GOB¾ES½WLPL½ADMFÛJDIT½V½CÝ" ||
		valor.substr(0,49)=="WWW2¾AGENCIATRIBUTARIA¾GOB¾ES¿WLPL¿ADMF½JDIT¿V¿C»" ||
		valor.substr(0,49)=="WWW2¾AGENCIATRIBUTARIA¾GOB¾ES7WLPL7ADMF¿JDIT7V½C0"
		) {
		precinta=valor.substr(49,11);
	}
	else if(

		valor.substr(0,57)=="HTTPSñ--WWW2.AGENCIATRIBUTARIA.GOB.ES-WLPL-admf'jdit-v_c¡" ||
		valor.substr(0,57)=="https://www2.agenciatributaria.gob.es/wlpl/ADMF-JDIT/V?C=" ||
		valor.substr(0,57)=="httpsÑ--www2.agenciatributaria.gob.es-wlpl-ADMF'JDIT-V_C¡" ||
		valor.substr(0,57)=="httpsñ--www2.agenciatributaria.gob.es-wlpl-admf'jdit-v-c¡" ||
		valor.substr(0,57)=="Https>&&www2.agenciatributaria.gob.es&wlpl&ADMF/JDIT&V_C)" ||
		valor.substr(0,57)=="https>&&www2.agenciatributaria.gob.es&wlpl&ADMF/JDIT&V_C)"
		) {
		precinta=valor.substr(57,11);
	}
	else precinta='error';
	
	return precinta;

}

function limpiaLecturaDesdeScannerNoPrecinta(lectura){

	//NOTA: lectura es un array que contiene en [0] la tecla gráfica y en el [1] el código de tecla pulsada
	//      por eso unas veces miramos un valor y otras, otro
	
	var cadenaLectura='';
	var siguientePosicion=0;
	
	for(var i=siguientePosicion;i<lectura.length;i++) {
		//if(lectura[1][1]==caracterEnter) break; //Fin de lectura
		if(lectura[i][1]==caracterEnter || lectura[i][2]=='Enter') break; //Fin de lectura
		else {
			if( lectura[i][1]==caracterControl && lectura[i+1][1]==caracterJota ) {
				i=i+2;
			}
			else cadenaLectura+=lectura[i][0];
		}
	}

	return cadenaLectura;
}


</script>

<?php

function eanDunValido($valor,$cadenaEans,$cadenaDuns) {

	unset($devolucion);
	
	$eansTemp=explode(';',$cadenaEans);
	$dunsTemp=explode(';',$cadenaDuns);
	
	$eans=array();
	$duns=array();
	
	// VCD añadimos urlencode para controlar espacios
	foreach($eansTemp as $item) $eans[]=urlencode($item); 
	foreach($dunsTemp as $item) $duns[]=urlencode($item);
	
	
	if($_GET['traza']=='si') {
	
		//echo "<p>Se evalúa código: ".$valor."</p>";
		
		//echo "<p>Listado de EANs:</p>";
		//print_r($eans);
		//echo "<p>Listado de DUNs:</p>";
		//print_r($duns);
	
	}

	//Primero se mira si coincide con un EAN
	foreach($eans as $ean) {
		if($ean==$valor) {
			$devolucion='EAN';
			break;
		}
	}
	//Si no coincide con un EAN, se mira si coincide con un DUN
	if(!isset($devolucion)) {
		foreach($duns as $dun) {
			if($dun==$valor) {
				$devolucion='DUN';
				break;
			}
		}
	}
	
	//SEGUNDO PROCESO: Si no coincide con nada, miramos si el leido es GTIN longitud 14 y el registrado en Proxium no
	if(!isset($devolucion)) {
		
		foreach($eans as $ean) {
			$ean=str_pad($ean,13,'00000000000000',STR_PAD_LEFT);
			if($ean==$valor) {
				$devolucion='EAN';
				break;
			}
		}
		if(!isset($devolucion)) {
			foreach($duns as $dun) {
				$dun=str_pad($dun,14,'00000000000000',STR_PAD_LEFT);
				if($dun==$valor) {
					$devolucion='DUN';
					break;
				}
			}
		}
		
	}
	
	//TERCER PROCESO: Si no coincide con nada, miramos si el registrado en Proxium es GTIN longitud 14 y el leido no
	if(!isset($devolucion)) {
		
		$valorGTIN13=str_pad($valor,13,'00000000000000',STR_PAD_LEFT);
		foreach($eans as $ean) {
			if($ean==$valorGTIN13) {
				$devolucion='EAN';
				break;
			}
		}
		if(!isset($devolucion)) {
			$valorGTIN14=str_pad($valor,14,'00000000000000',STR_PAD_LEFT);
			foreach($duns as $dun) {
				if($dun==$valorGTIN14) {
					$devolucion='DUN';
					break;
				}
			}
		}
		
	}
	
	return $devolucion;
	
}
?>