/*
 * Función que restringe la insercción en los input a solo carácteres numéricos
 * Funcion que valida el formulario, primero los campos vacíos y en una segunda validación, los campos con restricciones que
 * pueden tener errores.
 * @see
 * @param delAviso div que contiene los mensajes de aviso para borrarlos.
 * @param tipoError string con el mensaje del tipo de error.
 * @param errores string con el texto de todos los errtores encontrados.
 * @param boxAviso div con el id "aviso" que es donde se insertan los mensajes de error.
 * @param createAviso etiqueta p que se crea para insertar el texto con el tipo de error.
 * @param createError etiqueta p que se crea para insertar el texto con los errores encontrado.
 * @return
 */
 
 
//Función para controlar la inserción úncamente de números
function numOnly(key)
{
	key.value = key.value.replace(/[^0-9]/g, "");
}

function stopRKey(evt) 
{ 
	var evt = (evt) ? evt : ((event) ? event : null); 
	var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); 
	if ((evt.keyCode == 13) && (node.type=="text")) 
	{
	  return false;
	} 
} 

document.onkeypress = stopRKey;

function hideResults()
{
	var divResults =document.getElementById('results');
	if(divResults.style.display!="none")
	{
		divResults.style.display="none";	
	}
}

//Función principal
function form_CalculadoraPersonalLoan_Validator(form2)
{
	// Borramos los textos de error que pueda haber
	var delAviso = document.getElementById('aviso');
	delAviso.className='';
	delAviso.innerHTML ='';
	var formleng = form2.elements.length;
	//Quitamos los colores de fondo de todos los elementos del formulario menos el boton de enviar
	for(var i = 0; i < formleng - 1 ; i++)
	{
		form2.elements[i].style.background='#ffffff';
	}

		
	// Miramos si algun campo del formulario vacío
	if(form2.amount.value == '' || (form2.duration.value == '' || form2.duration.value == 0))
	{
		//Creamos las variables tipoError y errores
		var tipoError = error_mandatory;  // Existen campos del formulario sin rellanar
		var errores ='';
		
		//Validamos los campos si están vacíos, y si es así, añadimos mensaje de error a la variable errores y cambiamos su color de background a #c6f3ff
		if (form2.amount.value == '')
		{
			form2.amount.style.background='#c6f3ff';
			tipoError = tipoError + error_mandatory1;  // campo amount a rellenar
		}
		
		if (form2.duration.value == '' || form2.duration.value == 0)
		{
			form2.duration.style.background='#c6f3ff';
			tipoError = tipoError + error_mandatory2;  // campo duration a rellenar
		}
	} 	
	// Y si no está el campo vacío
	else if (form2.amount.value !== '' && (form2.duration.value !== '' || form2.duration.value !== 0))
	{
		var tipoError = '';
		if (form2.amount.value %50 != 0 || form2.amount.value<1000 || form2.amount.value>20000)
		{ 
			//Creamos las variables tipoError y errores
			var tipoError = error_invalid_input;
			form2.amount.style.background='#ffe4b1';
		}	
		// Si no hay ninguno con error
		if (!(isNaN(form2.amount.value)) && form2.amount.value % 50 == 0 && form2.amount.value !==0 && !(form2.amount.value<1000) && !(form2.amount.value>20000) && (form2.duration.value !== '' || form2.duration.value !== 0))
		{
			// Mandamos el formulario
			getRates(form2.amount.value,form2.duration.value);
			return false;
			//return (true);
		}	
	}
	// Al haber campos vacíos o campos con errores, buscamos el div con Id aviso y le asignamos el estilo .aviso
	var boxAviso = document.getElementById('aviso');
	boxAviso.className = 'aviso';

	//Creamos una etiqueta p dentro del div aviso para el texto en negrita, le asignamos el estilo .tipoError y le insertamos como html la variable tipoError
	var createAviso = boxAviso.appendChild(document.createElement('p'));
	createAviso.className = 'tipoError';
	createAviso.innerHTML = tipoError;
	
	// Cancelamos el envío del formulario
	return (false);
}

function calculateLoanMAR(loanValue, ppi, apr, term, selfTest)
{

	var mApr, mRepay, totalMAR, rpppi, mRpppi, totalLoanInterest;
	try
	{
		mApr = Math.pow((1+(apr/100)),(1/12))-1;
	
		monthlyRepayment = Math.round((loanValue*Math.pow(((1-(Math.pow((1+mApr),-term)))/mApr),-1))*100)/100;
		totalMarRAW = monthlyRepayment * term;
		totalMar = Math.round((totalMarRAW)*100)/100;
		totalLoanInterest = Math.round((((totalMarRAW*100)/100)-loanValue)*100)/100;
		rpppi = ((totalMarRAW*100)/100) * (ppi/100);
		monthlyrpppi = ((totalMarRAW * ppi/100)/12)/(term/12);
		mppi=Math.round((monthlyRepayment+monthlyrpppi)*100)/100;	
		totalMarPPI = Math.round(mppi*term*100)/100;
		if (selfTest)
		{	
			//document.getElementById('results').innerHTML="Monthly RP PPI="  + monthlyrpppi + " , MAR= " + monthlyRepayment + " , Total MAR = " + totalMar + " , Loan Interest="  + totalLoanInterest+ " , Monthly Repayments= " + totalMar/term;
			//console.log("Loan amount = £"+loanValue+" Term = "+ term +" months  Monthly RP PPI="  + monthlyrpppi + " , MAR= " + monthlyRepayment + " , Total MAR = " + totalMar + " , Loan Interest="  + totalLoanInterest+ " , Monthly Repayments= " + totalMar/term+ " MPPI= "+mppi+" Total amount repayable (with PPI)= "+parseInt(mppi*term*100)/100);
			document.getElementById('results').style.display="";
			document.getElementById('boton').value="Recalculate";
			document.getElementById('apr').innerHTML="&nbsp;"+apr+"&nbsp;%";
			document.getElementById('mar').innerHTML="&pound;&nbsp;"+addZero(monthlyRepayment);
			document.getElementById('marPPI').innerHTML="&pound;&nbsp;"+addZero(mppi) + "&nbsp;<span class=\"redText\">**</span>" ;
			document.getElementById('marTotal').innerHTML="&pound;&nbsp;"+ addZero(totalMar);
			document.getElementById('marPPITotal').innerHTML="&pound;&nbsp;"+addZero(totalMarPPI)+ "&nbsp;<span class=\"redText\">***</span>";
			mpi = document.getElementById('monthlyPPI');
			mpi.innerHTML = addZero(Math.round((mppi - monthlyRepayment)*100)/100);
			mpi.parentNode.style.visibility = "visible";
			tpi = document.getElementById('totalPPI');
			tpi.innerHTML = addZero(Math.round((totalMarPPI - totalMar)*100)/100) ;//addZero(Math.round(rpppi*100)/100);
			tpi.parentNode.style.visibility = "visible";
		}
		else 
		{
		    results = new Array(monthlyrpppi,monthlyRepayment, totalMar,totalLoanInterest);
			return results;
		}
	}
	catch (e)
	{
		//alert(e.message)
		return e.message;
	}
}

function getRates(loanValue, term){

	var apr = 0;
	var ppi = getPPI(loanValue,term);
	try
	{
		if(loanValue <= 2950)
		{
			apr = 14.9;
		}
		if(loanValue >= 3000 && loanValue <= 4950)
		{
			apr = 11.9;
		}
		if(loanValue >= 5000)
		{
			apr = 8.9;
		}
		results = calculateLoanMAR(loanValue,ppi,apr,term,true);
		return results;
	}
	catch (e)
	{
		return e.message;
	}
}
function getPPI(loanValue,term){
	
	var ppi;
	
	try{
		if(term >= 12 && term <18){
			ppi = 8.74078;
		}
		if(term >= 18 && term <30){
			ppi = 14.19274;
		}
		if(term >= 30 && term <42){
			ppi = 17.20316;
		}
		if(term >= 42 && term <54){
			ppi = 19.43461;
		}
		if(term >= 54 && term <66){
			ppi = 20.64455;
		}
		if(term >= 66 && term <78){
			ppi = 19.9162;
		}
		if(term >= 78 && term <90){
			ppi = 19.23585;
		}
		
		return ppi;
	}
	catch (e){
		return e.message;	
	}
}
function getDec(x) {
	x=x+"";
	//position of first decimal digit
	pos=x.indexOf('.')+1;
	//if 0, then no decimals (-1+1)
	if (pos>0)
	{
		return x.length-pos;
	}
	else
	{	
		return 0;
	}
}

function addZero(x){
	
	if(getDec(x) == 1) return x+"0";
	if(getDec(x) == 0)
	{
		return x+".00";
	}
	else
	{
		return x;
	}
	return x;
}