var acceptedPopup = false;
var automaticallySelectedSeats = null;


/**
 * Inicializacion
 */
$(document).ready(function()
{
	miCompra = new ObjCompra.Propiedades.Clase();
	miCompra.idRecinto = idRecinto;
	miCompra.idEvento = idEvento;

	////////////////////////////////////
	//  Configuracion Venta de Zonas  //
	////////////////////////////////////
	if(modo == "CIRCUNFERENCIA")
	{
		mostrarCirculoGrafico = true;
		if(modoTipoNumero == "ASIENTOS")
		{
			mostrarAsientosDisponibles = true;
			if(modoCantidad != null && modoCantidad > 0 && modoCantidad < 99999){
				mostrarAsientosAPartirDe = modoCantidad;
			}
		}
		else if(modoTipoNumero == "PORCENTAJE")
		{
			mostrarPorcentajeDisponible = true;
			if(modoCantidad != null && modoCantidad > 0 && modoCantidad < 99999){
				mostrarAsientosAPartirDePorcentaje = modoCantidad;
			}
		}
	}
	else if(modo == "PUNTO")
	{
		mostrarCirculoColor = true;
	}
	///////////////////////////////////////
	// FIN Configuracion Venta de Zonas  //
	///////////////////////////////////////


	crearVentanaEspera();
	setTimeout("procesarYPintarSesiones()", 10);


	//evento registro seleccion fecha en Google Analytics
	registrarPaginaGA(1);

	//Preseleccion por parametro
	//si el evento tiene evento sin fecha y las lista de sesion es de tamaño 1 entonces idSesionPreseleccionada = a la primera sesion

	if((arraySesiones!=null && arraySesiones.length > 0 && arraySesiones.length == 1) || idSesionPreseleccionada != null)
	{
		
		//sesion preselected
		if((promotionalCodeToApply == null || promotionalCodeToApply == "") && idSesionPreseleccionada != null)
		{
			setTimeout("seleccionarSesion()", 600);
			setTimeout("preseleccionaCompra()", 800);
		
		} //Invitations
		else if(promotionalCodeToApply != null && promotionalCodeToApply != "" &&  idSesionPreseleccionada != null)
		{
			hideAddNewPromotionalCode = true;
			CompraAjax.buscarTarjetaFidelizacion(promotionalCodeToApply, null, idSesionPreseleccionada, searchResultLoyaltyCardAndApply);
			
			setTimeout(function(){
				seleccionarSesion();
			},500);
			
		}
		else
		{
		
			idSesion = arraySesiones[0];
			//Si evento sin fecha (ejemplo parque tematico o Museo)
			if(!modoEventoSinFecha)
			{
				modoSinSeleccionFecha = true;
			}
	
			idSesionPreseleccionada = idSesion.idSesion;
			seleccionarSesion();
		}	

	}
	

	if (tieneDatosAdicionales)
	{
		$("#cab_datosAdicionales").show();
	}

	//Mostrar la barra pasado un segundo
	setTimeout("mostrarBarra()", 1000);

	establecerAlturaElementosCompra();

	paginaInicializada = true;

	//INIT LOYALTY CONTROLS
	/*popup layer closeable*/
	$('.layer-modal-closeable').mousedown(function(){
	  $(".popup").removeClass("show");
	});

	/*close popup link*/
	$('#close-modal-loyalty').mousedown(function(){
	  $(".popup").removeClass("show");
	});
	/*cancel button*/
	$('#close-loyalty-modal-btn').mousedown(function(){
	  $(".popup").removeClass("show");
	});

	gtmTrackFunnelStep(dataLayerP4, 1, 'Entering tickets selection');
	
	document.querySelector('#btnSeatsPopup').addEventListener('click', acceptedSeatsPopup);
	document.querySelector('#btnSeatsPopup').addEventListener('touchstart', acceptedSeatsPopup);
	
	if(hasSeatsPopup && !acceptedPopup)
	{
		$("#seatsPopup").addClass("show");
	}
	
	if (hideChangeDate && document.getElementById("cab_fecha"))
	{
		document.getElementById("cab_fecha").style.display = "none";
	}
});


//Set map height on resize
/*
window.onresize = function(event) {
	establecerAlturaMapas();
};
*/

function changeDate()
{
	$('#listaEntradas').html("");
	$('#datosAdicionales').html("");
	buyerAditionalData = new Array();
	cambioFechaH2();
}

var mapa = null;


function pintarTotalSeleccionado()
{
	var importeTotal = 0;
	var comisionTotal = 0;
	var entradasTotal = 0;

	for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
	{
		var dv = miCompra.entradasSeleccionadas[i];
		importeTotal += dv.cantidad * dv.importe;
		comisionTotal += dv.cantidad * dv.importeComisionUsuario;
		entradasTotal = entradasTotal + parseInt(dv.cantidad);
	}
	
	let specialProductsVal = null;
	if(productosSesion != null && productosSesion.specialProducts != null)
	{
		specialProductsVal = productosSesion.specialProducts;
	}
	let totalFee = calculateTransactionFee(specialProductsVal, importeTotal, comisionTotal);
	
	$("#valTransactionFee").html(getHtmlFormattedCurrency(totalFee));
	
	if(totalFee != 0 && totalFee > 0)
	{
		var htmlTransactionFee = "";
		var specialProduct =  productosSesion.specialProducts;
		for (var i = 0; i < specialProduct.length; i++)
		{
			if (specialProduct[i].idPriceType == TiposPrecio.FeeTransaction && specialProduct[i].litProduct.length > 0)
			{
				htmlTransactionFee += '<div class="tickets-type-sumary-price_fee" id="tickets-type-sumary-transaction_fee" > ' +
				' <div class="line-price"> '+
					' <div class="label-fee">' + specialProduct[i].litProduct + '</div> '+
						' <div class="value-fee">' + getHtmlFormattedCurrency(specialProduct[i].fixedAmount) + '</div> '+
						'</div> </div>';
			}
		}
		$("#tickets-summary-transaction-fee").html(htmlTransactionFee);
		$("#tickets-summary-transaction-fee").show();
	}
	else {
		$("#tickets-summary-transaction-fee").hide();
	}

	$("#tdImporteTotal").html(getHtmlFormattedCurrency(importeTotal+comisionTotal+totalFee));
	$("#tdComisionTotal").html(getHtmlFormattedCurrency(comisionTotal));

	barraAsientos(entradasTotal, false);
	barraTotal(importeTotal+comisionTotal+totalFee, miCompra.entradasSeleccionadas.length > 0);
}




function seleccionarEntradas()
{
	crearVentanaEspera();
	miCompra.entradasSeleccionadas = new Array();
	pintarTotalSeleccionado();
	erroresCantidadMinima = [];
	preciosDisponiblesButaca = [];

	permiteButacasSeparadas = true; // FIXME Evaluar cuando se permite sin llamar a servidor

	//Si es movil
//	if (isMobileSize())
//	{
//		idContPlano = "chartMobile";
//
//		//ocultamos contenedores
//		if(!hayFidelizacion)
//		{
//			$(".miga").hide();
//			$(".footer-mobile").hide();
//			$("#conts-seleccion-compra").hide();
//			$("#cab_asientos_mobile").show();
//
//			$("#"+idContPlano).show();
//		}
//		else
//		{
//			$("#cancelLoyaltyOption").show();
//		}
//	}
//	else
//	{
		idContPlano = "chart";

		//botones seleccion automatica
		$("#dialogoSeleccionAutomatica").hide();

	if(hideMiga!=null && hideMiga){
		$(".miga").hide();
	}else{
		$(".miga").show();
	}
		$(".footer-mobile").show();
		$("#conts-seleccion-compra").show();
		$("#cab_asientos_mobile").hide();

		$("#"+idContPlano).show();

		setTimeout(function(){
			saltarAContenedor("cab_planoSeleccion");
		},"500");
//	}

	cargarPlano();
}


function cargarPlano()
{	
	$("#"+idContPlano).html("");

	var bloquearCategorias = new Array();
	zonasRecinto = window[("PlanoSala" + miCompra.sesion.idSala)];
	var statusCategories = {};
	// FIXME Selector para recintos con planos a nivel de grupo de zonas o zona
	if (zonasRecinto != null)
	{
		zonaPlano = null;
		for (var i in zonasRecinto)
		{
			var zn = zonasRecinto[i];
			var productosActivos = getProductosActivosZona(zn.idZona);
			if (zonaPlano == null)
				zonaPlano = zn;

			if (productosActivos == null || productosActivos.length == 0)
				bloquearCategorias.push(zn.idZona);
			else
			{
				for (let j in productosSesion.entradas) {
					let z = productosSesion.entradas[j];
					if (z.idZona == zn.idZona) {
						
						let aforoDisponible = z.aforo - z.entradasBloqueadas - (z.entradasVendidas + z.entradasReservadas);

						if (aforoDisponible <= 0) {
							bloquearCategorias.push(z.idZona)
						}
						
						for (let x in z.precios)
						{
							productosSesion.entradas[j].precios[x].litProducto = getObjNameMultiLang(OBJ_TYPES_MULTILNG.PRODUCTS, z.precios[x].idProducto);
						}
						statusCategories[z.idZona] = {
								color: z.color,
								aforo: z.aforo,
								reservadas: z.entradasReservadas,
								vendidas: z.entradasVendidas,
								litZona: z.litZona
							}
						break;
					}
				}
			}
		}
	}
	
	var listaIdButacasPreseleccionadas = [];

	var idGrupoZonasPlano = null;
	var idZonaPlano = null;

	var idPlano = zonaPlano.idPlanoZona;
	if (idPlano == null)
	{
		idPlano = zonaPlano.idPlanoGrupoZonas;
	}
	else
	{
		idZonaPlano = zonaPlano.idZona;
	}

	if (idPlano == null)
	{
		idPlano = zonaPlano.idPlanoSala;
	}
	else
	{
		idGrupoZonasPlano = zonaPlano.idGrupoZonas;
	}

	if (modoSeleccionAsientos == ModoSeleccionAsiento.MODO_SELECCION_ASIENTO_PLANO)
		numEntradasSeleccionadas = maxEntradasTransaccion;

    mapa = new seatsio.SeatingChart({
        divId: idContPlano,
        idPlano: idPlano,
        idSesion: miCompra.sesion.idSesion,
        idCanal: idCanal,
        idGrupoZonas: idGrupoZonasPlano,
        idZona: idZonaPlano,
        showCapacity: mostrarAforoZona,
        language: localLanguage,
        messages: {
            "ESCENARIO": polyglot.t("Stage"),
            "Escenario": polyglot.t("Stage")
        },
        allowOrphanSeats:permiteButacasSeparadas,
        maxSelectedObjects: maxEntradasTransaccion,
        unavailableCategories: bloquearCategorias,
        statusCategories: statusCategories,
        selectedObjects: listaIdButacasPreseleccionadas,
        onObjectSelected: objetoSeleccionado,
        onObjectDeselected: objetoDeseleccionado,
        onMaximumSelectedTicketsReached: maximumSelectedTicketsReached,
        tooltipText: mostrarToolTip
    }).render();


    $("#"+idContPlano).show();

    $("#asientosSeleccionados").show();

    if (miCompra.entradasSeleccionadas.length == 0)
    {
//    	$("#listaEntradas").html('');
    }

    cerrarVentanaEspera();

    registrarPaginaGA(5);
}

function objetoSeleccionado(object)
{
	for (var j in zonasRecinto)
	{
		var zn = zonasRecinto[j];

		if (object.catId == zn.idZona || (object.category && object.category.catId == zn.idZona))
		{
			if(object.objectType != "GeneralAdmissionArea")
			{
				for (var i in zn.butacas)
				{
					var but = zn.butacas[i];
					if (but.idButaca == object.id)
					{
						generaDatosEntradaNumerada(zn, but, object.promo);
						break;
					}
				}
			}
			else
			{
				generaDatosEntradaNoNumerada(zn, object.promo);
			}
			break;
		}
	}

	pintarTotalSeleccionado();
	registrarObjetoVenta();
	drawAditionalData(miCompra.entradasSeleccionadas);
	drawMinimumNumberTicketsLeft();
	unblockGroupPromotionsButtons();
	gtmTrackProductClick(miCompra);
}


function objetoDeseleccionado(object)
{
	if (object.objectType != "GeneralAdmissionArea")
	{
		for (let i in miCompra.entradasSeleccionadas)
		{
			let dv = miCompra.entradasSeleccionadas[i];
			if (object.id == dv.idButaca)
			{
				quitarButaca(dv.temporalID, true);
				break;
			}
		}
	} 	
	else 
	{
		quitarEntradaNoNumerada(object.category.catId);
	}
	
	registrarObjetoVenta();
	drawAditionalData(miCompra.entradasSeleccionadas);
	drawMinimumNumberTicketsLeft();
	unblockGroupPromotionsButtons();
	gtmTrackProductClick(miCompra);
}

function maximumSelectedTicketsReached(object, text)
{
	alertaKO(polyglot.t("Error_while_selecting"), polyglot.t(text));
}

function checkForZoneImages(idZona)
{
	for (let j in productosSesion.entradas) 
	{
		let zone = productosSesion.entradas[j];
		if (zone.idZona == idZona) 
		{
			if( zone.viewType != 0 || zone.seatmapExtraImages.length != 0)
			{
				return true;	
			}
			else
			{
				return false;
			}
		}
	}
	return false;
}


function generaDatosEntradaNumerada(zn, but, promo)
{
	var preciosDisponibles = getPreciosDisponiblesZona(zn, null, promo);
	// FIXME Que hacer si no hay preciosDisponibles

	var dv = nuevoProducto(preciosDisponibles[0], 1);
	dv.idButaca = but.idButaca;
	dv.litFila = but.litFila;
	dv.litButaca = but.litButaca;
	dv.promo = promo;
	miCompra.entradasSeleccionadas.push(dv);
	
	preciosDisponiblesButaca[dv.temporalID] = preciosDisponibles;
	
	if (!$('#listaEntradas-head').length){
		var head = '<div id="listaEntradas-head" class="ticket-header-row">'
		+'<div class="tickets-zone hide-for-small-only">' + polyglot.t("Zone") + '</div>'
		+'<div class="tickets-row">' + polyglot.t("Row") + '</div>'
		+'<div class="tickets-seat">' + polyglot.t("Seat") + '</div>'
		+'<div class="tickets-type">' + polyglot.t("fanId.request.TicketType") + '</div>'
		+'</div>';
		
        $('#listaEntradas').append(head);
    }
    
    var zoneImages = "";
	
	if (checkForZoneImages(zn.idZona))
	{
		zoneImages += "<a class=\"view-icon\" onclick=\"showSeatmapOverlay(event, " + zn.idZona + ");\"><i class=\"palco4icon palco4icon-eye\"></i></a>";	
	}

	var html = '<div id="fila' + dv.temporalID + '" class="ticket-row-list">'
		+ ' <div class="tickets-zone hide-for-small-only">'
		+ '  <div class="name-zone" title="' + dv.litZona + '">' + dv.litZona + zoneImages + '</div>'
		+ ' </div>'
		+ ' <div class="tickets-row">' + dv.litFila + '</div>'
		+ ' <div class="tickets-seat">' + dv.litButaca + '</div>'
		+ ' <div class="tickets-price">'
		+ generaDropdownPrecios(dv, preciosDisponibles)
		+ '<div id="info-tickets-'+dv.temporalID+'"></div>'
		+ ' </div>'
		+ ' <div class="tickets-options">'
		+ '  <a href="#" onclick="quitarButaca(' + dv.temporalID + '); return false;"><i class="palco4icon palco4icon-delete"></i></a>'
		+ ' </div>'
		+ '</div>';

	$("#listaEntradas").append(html);

	$('#dropdown' + dv.temporalID).dropdown({
		on: 'click',
		onChange: recalcularPreciosDisponibles
	});

	$("#msgAsientosNoSeleccionados").hide();
	$("#listaEntradas").show();

	recalcularPreciosDisponibles();
}
function generaDatosEntradaNoNumerada(zn, promo)
{	
	for (let i in productosSesion.entradas)
	{
		let z = productosSesion.entradas[i];
		if (z.idZona == zn.idZona)
		{
			zn = z;
			break;
		}
	}
	
	let carritoZona = 0;
	for (let i in miCompra.entradasSeleccionadas)
	{
		if (miCompra.entradasSeleccionadas[i].idZona == zn.idZona)
		{
			carritoZona++;
		}
	}
	let aforoDisponible = zn.aforo - carritoZona - zn.entradasBloqueadas - (zn.entradasVendidas + zn.entradasReservadas);

	if (aforoDisponible <= 0)
	{
		alertaExcepcion(polyglot.t("There_are_no_availability"));
		mapa.decreaseSelection(zn.idZona);
		return;
	}
	var preciosDisponibles = getPreciosDisponiblesZona(zn, null, promo);
	// FIXME Que hacer si no hay preciosDisponibles

	var dv = nuevoProducto(preciosDisponibles[0], 1);
	dv.promo = promo;
	miCompra.entradasSeleccionadas.push(dv);

	preciosDisponiblesButaca[dv.temporalID] = preciosDisponibles;
	
	if (!$('#listaEntradas-head').length){
		var head = '<div id="listaEntradas-head" class="ticket-header-row">'
		+'<div class="tickets-zone hide-for-small-only">' + polyglot.t("Zone") + '</div>'
		+'<div class="tickets-row">' + polyglot.t("Row") + '</div>'
		+'<div class="tickets-seat">' + polyglot.t("Seat") + '</div>'
		+'<div class="tickets-type">' + polyglot.t("fanId.request.TicketType") + '</div>'
		+'</div>';
		
        $('#listaEntradas').append(head);
    }
	
	var zoneImages = "";
	
	if (checkForZoneImages(zn.idZona))
	{
		zoneImages += "<a class=\"view-icon\" onclick=\"showSeatmapOverlay(event, " + zn.idZona + ");\"><i class=\"palco4icon palco4icon-eye\"></i></a>";	
	}

	var html = '<div id="fila' + dv.temporalID + '" class="ticket-row-list">'
		+ ' <div class="tickets-zone hide-for-small-only">'
		+ '  <div class="name-zone" title="' + dv.litZona + '">' + dv.litZona + zoneImages + '</div>'
		+ ' </div>'
		+ ' <div class="tickets-row"> </div>'
		+ ' <div class="tickets-seat"> </div>'
		+ ' <div class="tickets-price">'
		+ generaDropdownPrecios(dv, preciosDisponibles)
		+ '<div id="info-tickets-'+dv.temporalID+'"></div>'
		+ ' </div>'
		+ ' <div class="tickets-options">'
		+ '  <a href="#" onclick="quitarButaca(' + dv.temporalID + '); return false;"><i class="palco4icon palco4icon-delete"></i></a>'
		+ ' </div>'
		+ '</div>';

	$("#listaEntradas").append(html);

	$('#dropdown' + dv.temporalID).dropdown({
		on: 'click',
		onChange: recalcularPreciosDisponibles
	});

	$("#msgAsientosNoSeleccionados").hide();
	$("#listaEntradas").show();

	recalcularPreciosDisponibles();
}

var volverAAsignarPrecios = false;

function generaDropdownPrecios(dv, preciosDisponibles)
{
	if (preciosDisponibles == null || preciosDisponibles.length == 0)
		return "-";
	var html = '';
	
	if (preciosDisponibles.length == 1)
	{
		var precio = preciosDisponibles[0];
			
		let totalSelectedTicketType = amountTicketsSelectedSameType(dv.idProducto);

//		if ((precio.minEntradasVenta == null || precio.minEntradasVenta >= miCompra.entradasSeleccionadas.length) &&
//				(precio.maxEntradasVenta == null || precio.maxEntradasVenta <= miCompra.entradasSeleccionadas.length))
//		{
			html += '<div class="tickets-unique-price"><input name="prod' + dv.temporalID + '" value="' + dv.idProducto + '" type="hidden" />'
			+ precio.litProducto + ' - ';

			if (precio.fidePromocionRedimir == null)
			{
				html += getHtmlFormattedCurrency(precio.precio);
				if(precio.comisionUsuario != null && precio.comisionUsuario > 0)
				{
					html += "<small> + "+getHtmlFormattedCurrency(precio.comisionUsuario)+" "+polyglot.t("fee")+"</small>";
				}
			}
			else
				html += precio.puntosRedimir;
				
			html += "</div>";
//		}
		return html;
	}

	html = '<div class="ui selection dropdown" id="dropdown' + dv.temporalID + '">'
		+ ' <input name="prod' + dv.temporalID + '" value="' + dv.idProducto + '" type="hidden" />'
		+ ' <i class="dropdown icon"></i>'
		+ ' <span class="text"></span>'
		+ ' <div class="menu">';

	for (var i in preciosDisponibles)
	{
		var precio = preciosDisponibles[i];

		if (precio.idTipoPrecio == TiposPrecio.Promo && !dv.promo)
			continue;
		
		let totalSelectedTicketType = amountTicketsSelectedSameType(dv.idProducto);
		
		// loyalty product only accumulates
		//TODO: CLC revisar, no entiendo
		/*
		if (precio.fidePromocionMostrar != null && precio.fidePromocionRedimir == null)
		{
			continue;
		}
		*/
		
//		if ((precio.minEntradasVenta != null && precio.minEntradasVenta > totalSelectedTicketType)
////			|| (precio.maxEntradasVenta != null && precio.maxEntradasVenta < miCompra.entradasSeleccionadas.length)
//			)
//		{
//			continue;
//		}
		if ((precio.minEntradasVenta != null || precio.maxEntradasVenta != null) && !volverAAsignarPrecios)
		{
			volverAAsignarPrecios = true;
		}

		html += '<div class="item" id="optionPrice_' + dv.temporalID + '_' + precio.idProducto + '"data-value="' + precio.idProducto + '">' + precio.litProducto + ' - ';

		if (precio.fidePromocionRedimir == null)
		{
			html += getHtmlFormattedCurrency(precio.precio);
			if(precio.comisionUsuario != null && precio.comisionUsuario > 0)
			{
				html += "<small> + "+getHtmlFormattedCurrency(precio.comisionUsuario)+" "+polyglot.t("fee")+"</small>";
			}
		}
		else
		{
			var namePoint = polyglot.t("points");
			if(promoFidelizacion != null) {
				namePoint = promoFidelizacion.loyaltyPointsName;
			}
			html += precio.puntosRedimir + " " + namePoint;
		}
			

		html += '</div>';
	}

	html += '</div></div>';
	return html;
}


var erroresCantidadMinima = [];
var preciosDisponiblesButaca = [];

function getPreciosDisponiblesZona(zn, idButacaActual, promo)
{
	var precios = [];
	var idProductoActual = null;
	if (idButacaActual != null)
	{
		idProductoActual = $("#prod" + idButacaActual).val();
	}

	var zona = getZonaPrecios(zn.idZona);

	for (var j=0; j < zona.precios.length; j++)
	{
		var precioZona = zona.precios[j];

		if (precioZona.idTipoPrecio == TiposPrecio.Promo && !promo)
			continue;

		var inactivoFidelizacion = precioZona.fidePromocionMostrar != null && !tienePromocionTarjeta(precioZona.fidePromocionMostrar);

		if (!inactivoFidelizacion)
		{
			var entradasActuales = 0;
			for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
			{
				var dv = miCompra.entradasSeleccionadas[i];
				if (dv.idProducto == precioZona.idProducto)
					entradasActuales++;
			}

			var entMin = 0;
			if (precioZona.minEntradasVenta != null)
				entMin = precioZona.minEntradasVenta;

			var entMax = maxEntradasTransaccion;

//			if (precioZona.maxEntradasVenta != null && entMax > precioZona.maxEntradasVenta)
//				entMax = precioZona.maxEntradasVenta;

			if (precioZona.maxCantidadSesion != null && entMax > precioZona.maxCantidadSesion)
				entMax = precioZona.maxCantidadSesion;

			if (precioZona.fidePromocionMostrar)
			{
				var saldoPuntos = getPuntosPromocion(precioZona.fidePromocionMostrar);
				if (entMax > saldoPuntos)
					entMax = saldoPuntos;
			}

			if (entMin != 0 && entMin > entradasActuales)
				erroresCantidadMinima["p" + precioZona.idProducto] = precioZona;
			else if (erroresCantidadMinima["p" + precioZona.idProducto])
				delete erroresCantidadMinima["p" + precioZona.idProducto];

			if (idProductoActual != null && idProductoActual == precioZona.idProducto)
				entradasActuales--;

			if (entradasActuales <= entMax)
				precios.push(precioZona);
		}

	}

	return precios;
}


function recalcularPreciosDisponibles(nuevoIdProducto, textoSelect)
{
	var idButacaCambio = null;
	if (this != null && this.id != null)
	{
		if (this.id.startsWith("dropdown"))
			idButacaCambio = parseInt(this.id.substring("dropdown".length));
	}

	if (idButacaCambio != null)
	{
		for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
		{
			var dv = miCompra.entradasSeleccionadas[i];

			if (dv.temporalID == idButacaCambio)
			{
				var producto = getProductoZona(dv.idZona, nuevoIdProducto);
				miCompra.entradasSeleccionadas[i] = cambiaProductoDetalleVenta(dv, producto);
				registrarObjetoVenta();
				break;
			}
		}
	}

	var thereAreChangesinPrice = checkCondicionesPreciosSeleccionados(nuevoIdProducto, idButacaCambio);
	for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
	{
		var dv = miCompra.entradasSeleccionadas[i];
		let price = preciosDisponiblesButaca[dv.temporalID].filter(e => e.idProducto == dv.idProducto)[0];
		let infoTickets = document.getElementById("info-tickets-"+dv.temporalID);
		if (price.maxEntradasVenta > 0 && price.minEntradasVenta > 0)
		{
			if (price.maxEntradasVenta === price.minEntradasVenta)
			{
				infoTickets.innerHTML = polyglot.t("Select_a_minimum_and_maximum_of_(num)_tickets_of_this_type_to_be_elegible_for_purchase_at_this_price", {tickets: price.maxEntradasVenta});
			}
			else
			{
				infoTickets.innerHTML = polyglot.t("Select_between_(num)_and_(num)_of_this_type_to_be_elegible_for_purchase_at_this_price", {minTickets: price.minEntradasVenta, maxTickets: price.maxEntradasVenta});
			}
		}
		else if (price.minEntradasVenta > 0 && !price.maxEntradasVenta)
		{
			infoTickets.innerHTML = polyglot.t("Select_at_least_(num)_tickets_of_this_type_to_be_elegible_for_purchase_at_this_price", {minTickets: price.minEntradasVenta});
		}
		else if (!price.minEntradasVenta && price.maxEntradasVenta > 0)
		{
			infoTickets.innerHTML = polyglot.t("Maximum_of_(num)_tickets_of_this_type_to_be_elegible_for_purchase_at_this_price", {maxTickets: price.maxEntradasVenta});
		}
		else 
		{
			infoTickets.innerHTML = "";
		}

		if (idButacaCambio != null && dv.temporalID == idButacaCambio)
			continue;

		var nuevosPreciosDisponibles = getPreciosDisponiblesZona(getZonaPrecios(dv.idZona), dv.temporalID, dv.promo);

		var preciosDisponibles = preciosDisponiblesButaca[dv.temporalID];
		var hayCambios = nuevosPreciosDisponibles.length == preciosDisponibles.length;
		if (!hayCambios)
		{
			for (var j=0; j<preciosDisponibles.length; j++)
			{
				if (preciosDisponibles[j].idProducto != nuevosPreciosDisponibles[j].idProducto)
				{
					hayCambios = true;
					break;
				}
			}
		}

		if (hayCambios)
		{
			preciosDisponibles = nuevosPreciosDisponibles;
			preciosDisponiblesButaca[dv.temporalID] = preciosDisponibles;


			var precioActual = -1;
			for (var j=0; j<preciosDisponibles.length; j++)
			{
				var precio = preciosDisponibles[j];
				let totalSelectedTicketType = amountTicketsSelectedSameType(dv.idProducto);

//				if ((precio.minEntradasVenta == null || precio.minEntradasVenta <= totalSelectedTicketType) &&
//						(precio.maxEntradasVenta == null || precio.maxEntradasVenta >= totalSelectedTicketType))
//				{
					if(precioActual == -1)
					{
						precioActual = preciosDisponibles[j];
					}
					if (precio.idProducto == dv.idProducto)
					{
						precioActual = preciosDisponibles[j];
						break;
					}

//				}
			}

			if (!thereAreChangesinPrice)
			{
				miCompra.entradasSeleccionadas[i] = cambiaProductoDetalleVenta(dv, precioActual);
			}

			$('#dropdown' + dv.temporalID).replaceWith(generaDropdownPrecios(dv, preciosDisponibles));
				$('#dropdown' + dv.temporalID).dropdown({
					on: 'click',
					onChange: recalcularPreciosDisponibles
				});	

			if (nuevoIdProducto != null)
			{
				var newProduct = getProductoZona(dv.idZona, nuevoIdProducto);
				if (newProduct && !meetsPriceRequirements(newProduct))
				{
					checkCondicionesPreciosSeleccionados(precioActual.idProducto, idButacaCambio);
				}
			}

		}

	}

	registrarObjetoVenta();
	pintarTotalSeleccionado();
}

function checkCondicionesPreciosSeleccionados(nuevoIdProducto, idButacaCambio)
{
	var thereAreChanges = false;
	if (nuevoIdProducto == null && idButacaCambio == null && volverAAsignarPrecios)
	{
		for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
		{
			var dv = miCompra.entradasSeleccionadas[i];
			if (!isActualPriceAvailable(dv))
			{
				var precioBase = preciosDisponiblesButaca[dv.temporalID][0];
				miCompra.entradasSeleccionadas[i] = cambiaProductoDetalleVenta(dv, precioBase);
				$('#dropdown' + dv.temporalID).replaceWith(generaDropdownPrecios(dv, preciosDisponiblesButaca[dv.temporalID]));
				$('#dropdown' + dv.temporalID).dropdown({
					on: 'click',
					onChange: recalcularPreciosDisponibles
				});
			}
		}
	}
	if (nuevoIdProducto != null && idButacaCambio != null && volverAAsignarPrecios)
	{
		thereAreChanges = true;
		for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
		{
			var dv = miCompra.entradasSeleccionadas[i];
			if (idButacaCambio == dv.temporalID && dv.idProducto != nuevoIdProducto)
			{
				// var newProduct = getProductoZona(dv.idZona, nuevoIdProducto);
				// miCompra.entradasSeleccionadas[i] = cambiaProductoDetalleVenta(dv, newProduct);
				$('#dropdown' + dv.temporalID).replaceWith(generaDropdownPrecios(dv, preciosDisponiblesButaca[dv.temporalID]));
				$('#dropdown' + dv.temporalID).dropdown({
					on: 'click',
					onChange: recalcularPreciosDisponibles
				});
			}
		}
	}
	volverAAsignarPrecios = false;
	return thereAreChanges;
}

function meetsPriceRequirements(product)
{
	var meetsRequirements = false;

	if (product.minEntradasVenta != null || product.maxEntradasVenta != null)
	{
		var numberOfProductTickets = 0;
		for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
		{
			var dv = miCompra.entradasSeleccionadas[i];
			if (dv.idProducto == product.idProducto)
			{
				numberOfProductTickets++;
			}
		}
		meetsRequirements = ((product.minEntradasVenta == null || numberOfProductTickets >= product.minEntradasVenta) &&
				(product.maxEntradasVenta == null || numberOfProductTickets <= product.maxEntradasVenta));
	}
	else
	{
		meetsRequirements = true;
	}

	return meetsRequirements;
}

function quitarEntradaNoNumerada(idZona)
{
	for (var i = miCompra.entradasSeleccionadas.length - 1; i >= 0; i--)
	{
		var dv = miCompra.entradasSeleccionadas[i];

		if (dv.idZona == idZona)
		{
			$('#fila' + dv.temporalID).remove();
			miCompra.entradasSeleccionadas.splice(i, 1);
			buyerAditionalData.splice(i, 1);
			recalcularPreciosDisponibles();
			break;
		}
	}
	if (miCompra.entradasSeleccionadas.length == 0)
	{
		$("#msgAsientosNoSeleccionados").show();
		$("#listaEntradas").hide();
	}
}

function quitarButaca(idButaca, fromSeatmap = false)
{
	for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
	{
		var dv = miCompra.entradasSeleccionadas[i];

		if (dv.temporalID == idButaca)
		{
			$('#fila' + dv.temporalID).remove();
			miCompra.entradasSeleccionadas.splice(i, 1);
			buyerAditionalData.splice(i, 1);
			recalcularPreciosDisponibles();
			if (!fromSeatmap)
			{
				if (dv.idButaca == null) mapa.decreaseSelection(dv.idZona);
				else mapa.deselectObjects([dv.idButaca]);
			}
			break;
		}
	}

	if (miCompra.entradasSeleccionadas.length == 0)
	{
		$("#msgAsientosNoSeleccionados").show();
		$("#listaEntradas").hide();
	}

	pintarTotalSeleccionado();
}

function comprarFinal()
{
	if (mandatoryNumberTickets && mandatoryNumberTickets != miCompra.entradasSeleccionadas.length)
	{
		swal(msgDebesSelButacas.replace("{0}", mandatoryNumberTickets));
		return;
	}
	
	if (!checkValidProductSelection())
	{
		return;
	}

	if (pidiendoDatosAdicionales && venta != null)
	{
		if (selectedGroupPromotion != null)
		{
			venta.idGroupPromotion = selectedGroupPromotion;
		}

		if (validaFormularioDatosExtra(venta.detalle, recogerTitularNif, recogerTitularNombre, preguntaDato1, preguntaDato2))
		{
			CompraAjax.registrarVenta(venta, idCanal, tarjetaFidelizacion != null ? tarjetaFidelizacion.numTarjeta : null, iframeMode, compraRegistrada);
		}
		else
		{
			if (browsingInPhone())
			{
				ocultarPlanoMobile("cab_datosAdicionales");
			}

			setTimeout(function(){
				saltarAContenedor("cab_datosAdicionales");
			},"500");

			setTimeout(function(){
				swal(polyglot.t("Fill_additional_info"));
			}, 200);

		}

		return;
	}

	// TODO Validar cantidad minima
	registrarCompra();
}


function registrarObjetoVenta()
{
	venta = new Venta();
	venta.detalle = new Array();
	venta.pago = new Array();
	venta.importePagado = 0;
	venta.modificado = true;
	venta.idComprador = -idEmpresa;

	for (var i=0; i<miCompra.entradasSeleccionadas.length; i++)
	{
		venta.detalle.push(copiaDetalleVenta(miCompra.entradasSeleccionadas[i]));
		venta.detalle[i].idButaca = miCompra.entradasSeleccionadas[i].idButaca;
	}

	if (oldOrderId != null && !isNaN(parseInt(oldOrderId)))
	{
		venta.idVentaOriginal = parseInt(oldOrderId)
	}

	if(reservationType != null && !isNaN(parseInt(reservationType)))
	{
		venta.idTipoReserva = parseInt(reservationType)
	}

	venta.numTarjetaFidelizacion = tarjetaFidelizacion != null ? tarjetaFidelizacion.numTarjeta : null;
}

function registrarCompra()
{
	if (!tieneDatosAdicionales)
	{
		if (typeof selectedGroupPromotion !== 'undefined' && selectedGroupPromotion != null)
		{
			venta.idGroupPromotion = selectedGroupPromotion;
		}

		if (!checkValidProduct())
		{
			setTimeout(function(){
				swal(polyglot.t("ERROR_CODE.ERR_TI_TICKET_DATA"));
			}, 200);
		}

		//TODO sustituir a jquery.blockui por un bug que
		/*
		setTimeout(function(){
			crearVentanaEspera();
		}, 50);
		*/

		CompraAjax.registrarVenta(venta, idCanal, tarjetaFidelizacion != null ? tarjetaFidelizacion.numTarjeta : null, iframeMode, compraRegistrada);
	}
}

function compraRegistrada(ventaMetodo)
{
	venta = ventaMetodo;
	if (venta != null)
	{
		if (forceSubitemsFlow())
		{
			cambiarVentanaEsperaOK();
			return;
		}
		
		$.cookie("purchase_id", venta.localizador, { expires: 1/144, path: pathCookies, domain: dominioCookies });
		//$("#idVenta").val(venta.idVenta);
		$("#localizador").val(venta.localizador);

		if (tarjetaFidelizacion != null)
			$("#numTarjetaFidelizacion").val(tarjetaFidelizacion.numTarjeta);
		else
			$("#numTarjetaFidelizacion").val("");

		gtmTrackFunnelStep(dataLayerP4, 2, 'Tickets selected', venta);

		//Iframe mode
		if(iframeMode)
		{
			var orderJson = transformVentaToOrderJson(venta);
			sendMessageBookingJson(orderJson);
			if(iframeSelectTicketMode)
			{
				return;
			}
		}

		var filteredProducts = salePlaceProductFilter();
		let hasProducts = (filteredProducts != null && filteredProducts.length > 0);
		
		// Load buyProducts view if there's a donation that should be rendered on that page
		if(productosSesion.specialProducts != null && productosSesion.specialProducts.length > 0) {
			productosSesion.specialProducts.forEach(sp => {
				if(sp.idProductType == ProductType.DONATION && sp.salePlace == 1) {
					hasProducts = true;
				}
			});
		}
		
		if(hasProducts)
		{
			$('#formAddToCart').attr('action', appendCommonUrlParameters('comprarProductos', urlTokenParameters));
		}
		else if (surveyId != null && !isNaN(surveyId))
		{
			$('#formAddToCart').attr('action', appendCommonUrlParameters('survey?surveyId=' + surveyId + "&whereIsShown=1", urlTokenParameters));
		}
		$("#formAddToCart").submit();
	}
}

function checkValidProductSelection()
{
	var detalle = miCompra.entradasSeleccionadas;
	var productsSelected = new Array();

	if (detalle != null && detalle.length > 0)
	{
		for (var i in detalle)
		{
			var dv = detalle[i];
			var productId = dv.idProducto;

			var product = getObjetoPorId(productId, productsSelected, "productId");
			if (product != null)
			{
				product.currentSelection += dv.cantidad;
			}
			else
			{
				var newProduct = {
						productId : productId,
						currentSelection : dv.cantidad
				};

				productsSelected.push(newProduct);
			}
		}

		for (var i in productosSesion.entradas)
		{
			var aforoVenta = productosSesion.entradas[i];
			for (var j in aforoVenta.precios)
			{
				var price = aforoVenta.precios[j];
				var product = getObjetoPorId(price.idProducto, productsSelected, "productId");
				if (product != null)
				{
					product.litProducto = price.litProducto;
					product.minEntradasVenta = price.minEntradasVenta;
					product.maxEntradasVenta = price.maxEntradasVenta;
				}
			}
		}

		for (var i in productsSelected)
		{
			var productSelected = productsSelected[i];

			var minimumNotReached = productSelected.minEntradasVenta != null && productSelected.minEntradasVenta > productSelected.currentSelection;
			if (minimumNotReached)
			{
				swal(polyglot.t("Current_selection_invalid_minimum_not_reached",
						{ minNumTickets : productSelected.minEntradasVenta, productName : productSelected.litProducto, currentSelection : productSelected.currentSelection}));

				return false;
			}

			var maximumExceeded = productSelected.maxEntradasVenta != null && productSelected.maxEntradasVenta < productSelected.currentSelection;
			if (maximumExceeded)
			{
				swal(polyglot.t("Current_selection_invalid_maximum_exceeded",
						{ maxNumTickets : productSelected.maxEntradasVenta, productName : productSelected.litProducto, currentSelection : productSelected.currentSelection}));

				return false;
			}
		}

		return true;
	}
}

function jumpToNextGroupPromotionSelected()
{
	//seleccionarEntradas();
}

function showLoyalty()
{
	//new
	if(hideAddNewPromotionalCode != null && hideAddNewPromotionalCode == false)
	{
		$("#link-modal-loyalty-content").show();
	}
}

function hideLoyalty()
{
	$("#cab_fidelizacion").hide();
}

function loyaltyCardApplied()
{
	tarjetaFidelizacion = loyaltyCardNotApplied;
	
	drawPromotionApplied(tarjetaFidelizacion);

	if (modoSeleccionAsientos == ModoSeleccionAsiento.MODO_SELECCION_ASIENTO_PLANO)
	{
		recalcularPreciosDisponibles();
	}
	else
	{
		pintarZonasSesionLista();
	}
	
	cargarPlano();

	setTimeout(function(){
		$(".popup").removeClass("show");
		cerrarVentanaEspera();
		/*
		 * TODO: en funcion del paso de compra --> enviar al contenedor correspondiente
		 * saltarAContenedor("cab_grid");
		*/
		
		//Custom function after to apply a promostion 
		if( typeof purchaseFlowCustomApplyPromotion === 'function' )
		{
			purchaseFlowCustomApplyPromotion();
		}
		
	}, 200);

}

function loyaltyCardAppliedAuto()
{
	tarjetaFidelizacion = loyaltyCardNotApplied;

	if (modoSeleccionAsientos == ModoSeleccionAsiento.MODO_SELECCION_ASIENTO_PLANO)
	{
		recalcularPreciosDisponibles();
	}
	else
	{
		pintarZonasSesionLista();
	}
}

function drawPromotionApplied(card)
{
	if(card != null)
	{
		let valueShowed = "";
		if(card.numTarjeta != null)
		{
			valueShowed = "<span class='code-applied-showed'>" + card.numTarjeta + "</span>"; 
		}
		$(".numCardPromoApplied").html(valueShowed);
	}
	else
	{
		$(".numCardPromoApplied").html("");
	}
}

function checkValidProduct()
{
	var detalle = miCompra.entradasSeleccionadas;
	var productsSelected = new Array();

	if (detalle != null && detalle.length > 0)
	{
		for (var i in detalle)
		{
			var dv = detalle[i];
			var productId = dv.idProducto;
			if (productId == undefined || productId == 'undefined')
			{
				return false;
			}
		}
	}
	return true;
}

function applyPromoOfWallet(numCard)
{
	crearVentanaEspera();
	CompraAjax.findLoyaltyCard(numCard, idEmpresa, loyaltyCardOfUserLoaded);
}

function loyaltyCardOfUserLoaded(card)
{
	if (card == null)
	{
		tarjetaFidelizacion = null;
		swal(polyglot.t("Invalid_card"), polyglot.t("Loyalty_card_not_found"), "error");
	}
	else
	{
		loyaltyCardNotApplied = card;
		loyaltyCardApplied();
		
		var promosInCard = card.saldoPromociones;
		if(promosInCard != null && promosInCard.length > 0){
			var firstPromo = promosInCard[0];
			CompraAjax.getPromotion(card.idCategoriaFidelizacion, firstPromo.idPromocion, setPromoLoyalty);
		}

	}
}

function amountTicketsSelectedSameType(idProduct)
{
	let totalTickets = 0;
	for (let i = 0; i < miCompra.entradasSeleccionadas.length; i++)
	{
		if (miCompra.entradasSeleccionadas[i].idProducto == idProduct)
		{
			totalTickets++;
		}
	}
	
	return totalTickets;
}

function isActualPriceAvailable(dv)
{
	let actualPrice = preciosDisponiblesButaca[dv.temporalID];
	let totalSelectedTicketType = amountTicketsSelectedSameType(dv.idProducto);
	for (let i = 0; i < miCompra.entradasSeleccionadas.length; i++)
	{
		if ((actualPrice.minEntradasVenta == null || actualPrice.minEntradasVenta <= totalSelectedTicketType) &&
						(actualPrice.maxEntradasVenta == null || actualPrice.maxEntradasVenta >= totalSelectedTicketType))
		{
			return true;
		}
	}
	return false;
}
