
/*
	VARIABLES EFFM
*/
	var digitos = "0123456789ABCDEFGHIJKLMNOPQRSTVWXZ.,";
	var baseOrigen = 10;
	var baseDestino = 2;
	var mostrarProcedimiento = false;
	var numeroOrigen = "";
	var numeroConvertido = "";
	var leyendaDigitos = new Array();
	var separadorDecimal = "";
	var mensajeBasesPotencia = "";

	leyendaDigitos[0] = "D\u00EDgitos base  2: 0, 1";
	leyendaDigitos[1] = "D\u00EDgitos base  3: 0, 1, 2";
	leyendaDigitos[2] = "D\u00EDgitos base  4: 0, 1, 2, 3";
	leyendaDigitos[3] = "D\u00EDgitos base  5: 0, 1, 2, 3, 4";
	leyendaDigitos[4] = "D\u00EDgitos base  8: 0, 1, 2, 3, 4, 5, 6, 7";
	leyendaDigitos[5] = "D\u00EDgitos base  9: 0, 1, 2, 3, 4, 5, 6, 7, 8";
	leyendaDigitos[6] = "D\u00EDgitos base 10: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9";
	leyendaDigitos[7] = "D\u00EDgitos base 16: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F";

	//var 

	function potenciaEntreBases(m,n){
		var potencia = 0;
		mensajeBasesPotencia = "";
		if((m>n) && (((Math.log(m) / Math.log(n))%1)==0)){
			potencia = Math.log(m)/Math.log(n);
			mensajeBasesPotencia = "<br/>Las bases <strong>" + n + "</strong> y <strong>" + m + "</strong> son bases potencia ya que <strong>" + n + "<sup>"+ potencia+"</sup> = " + m + "</strong>, lo que significa que <strong><u>1 d\u00EDgito de la base " + m + " equivale a " + potencia + " d\u00EDgitos de las base " + n + "</u></strong>. <br/>";
		}else if(((Math.log(n) / Math.log(m))%1)==0){
			//alert(Math.log(n)/Math.log(m) + " 2 " + " modulo " + ((Math.log(n) / Math.log(m))%1) + mostrarProcedimiento );
			potencia = Math.log(n)/Math.log(m);
			mensajeBasesPotencia = "<br/>Las bases <strong>" + n + "</strong> y <strong>" + m + "</strong> son bases potencia ya que <strong>" + m + "<sup>"+ potencia+"</sup> = " + n + "</strong>, lo que significa que <strong><u>1 d\u00EDgito de la base " + n + " equivale a " + potencia + " d\u00EDgitos de las base " + m + "</u></strong>. <br/>";
		}
		console.log('Buscando potencias entre las bases: ' + baseOrigen + " " + baseDestino + " " + potencia);
		return potencia;
	}

	function convertirBaseN(){
		if(baseOrigen<=digitos.length && baseDestino<=digitos.length && baseOrigen>=2 && baseDestino>=2){ //Las bases se pueden convertir.
			// Revisamos si lo d\u00EDgitos del n\u00FAmero forman parte de la base
			var origenValido = true;
			console.log('El n\u00FAmero es: ' + numeroOrigen);

			//Validamos por comas y puntos, s\u00F3lo puede existir uno

			var posicion = -1; 
			var compaPuntoEncontrado = false;
			var leyendaComas = "";
			var potenciaBases = 0;

			$("#procedimiento").html("");
			mensajeBasesPotencia = "";
			for(var i=0; i < numeroOrigen.length ; i++){
				var digitoRevisado = numeroOrigen.substring(i,i+1);
				posicion = digitos.indexOf(digitoRevisado);
				if(((posicion >= baseOrigen) && (posicion<34)) || (posicion<0)){
					origenValido = false;
					console.log('Posici\u00F3n de ' + numeroOrigen.substring(i,i+1) + ': ' + posicion);
					if(numeroConvertido.indexOf(digitoRevisado)<0){
						numeroConvertido += digitoRevisado + ",";
					}
				}else if((posicion==34) || (posicion==35)){ //Encontramos una coma o un punto
					if(!compaPuntoEncontrado){ //Encontramos una coma o un punto, es v\u00E1lido
						//console.log('Posici\u00F3n de 1er coma o punto ' + numeroOrigen.substring(i,i+1) + ': ' + posicion);
						compaPuntoEncontrado = true;
						separadorDecimal = digitoRevisado;
					}else{ //Encontramos m\u00E1s de una coma o punto y eso no es v\u00E1lido
						console.log('Contiene m\u00E1s de una coma o punto decimal.');
						origenValido = false;
						leyendaComas = "Contiene m\u00E1s de una coma o punto decimal.";
					}
				}  
			}
			
			if(origenValido){
				
				potenciaBases = potenciaEntreBases(baseOrigen,baseDestino);
				//if(potenciaBases==0){
					var entero = "";
					var decimal = "";
					if(separadorDecimal != ""){
						entero = numeroOrigen.split(separadorDecimal)[0];
						decimal = numeroOrigen.split(separadorDecimal)[1];
					}else{
						entero = numeroOrigen;
					}
		
					if(entero == ""){
						entero = "0";
					}									

					console.log('Entero ' + entero + " Decimal " + decimal);

					if(baseOrigen == 10){ //De base 10 a base N
						var cociente = parseInt(entero);
						var residuo = 0;
						
						while(cociente!=0){ //Convirtiendo el entero
							residuo = cociente % baseDestino;
							cociente = parseInt(cociente / baseDestino);
							numeroConvertido = digitos[residuo] + "" + numeroConvertido;
						}
						if(eval(entero)==0){
							numeroConvertido = "0";
						}

						if(decimal != ""){
							var decimales = parseFloat("0." + decimal).toPrecision(((decimal.length + 3)>21?21:decimal.length + 3));
							var enteroDigito = 0;
							numeroConvertido += separadorDecimal;
							var cuentaDecimales = 0;
							console.log('DECIMALES ' + enteroDigito + " " + decimales);
							while(decimales != 0  && (""+(decimales * baseDestino)).indexOf("e")<0){
								enteroDigito = parseInt(decimales * baseDestino);
								console.log('DECIMALES SIN PRECISION ' + ((decimales * baseDestino) - enteroDigito));
								decimales = ((decimales * baseDestino) - enteroDigito).toPrecision(((decimal.length + 3)>21?21:decimal.length + 3));
								numeroConvertido += digitos[enteroDigito];
								
								if(cuentaDecimales++ == 50){
									numeroConvertido += "...";
									decimales = 0;
									console.log('SALIENDO DE LOS DECIMALES ');
								}
								console.log('DECIMALES ' + enteroDigito + " " + decimales);
							}
						}
						

					} else if(baseDestino == 10){ //De base N a base 10
						var numeroConvertidoDecimal = 0;
						var j = 0;
						
						for(j=0;j<entero.length;j++){
							numeroConvertidoDecimal += (digitos.indexOf(entero[j]) * Math.pow(baseOrigen,entero.length - (j+1)));
						}
						for(j=1;j<=decimal.length;j++){
							
							numeroConvertidoDecimal += (digitos.indexOf(decimal[j-1])* Math.pow(baseOrigen,-j));
						}
						numeroConvertido = numeroConvertidoDecimal;

					} else { //De base M a base N
						var numeroConvertidoDecimal = 0;
						var j = 0;
						
						for(j=0;j<entero.length;j++){
							numeroConvertidoDecimal += (digitos.indexOf(entero[j]) * Math.pow(baseOrigen,entero.length - (j+1)));
						}
						entero = "" + numeroConvertidoDecimal;
						numeroConvertidoDecimal = 0;
						console.log('DECIMAL M N ' + decimal);
						for(j=1;j<=decimal.length;j++){
							
							numeroConvertidoDecimal += (digitos.indexOf(decimal[j-1])* Math.pow(baseOrigen,-j));
							console.log('DECIMAL M N for ' + numeroConvertidoDecimal);
						}
						decimal = "" + numeroConvertidoDecimal;
						console.log('DECIMAL M N ' + decimal);

						var cociente = parseInt(entero);
						var residuo = 0;
						
						while(cociente!=0){ //Convirtiendo el entero
							residuo = cociente % baseDestino;
							cociente = parseInt(cociente / baseDestino);
							numeroConvertido = digitos[residuo] + "" + numeroConvertido;
						}
						if(eval(entero)==0){
							numeroConvertido = "0";
						}

						if(decimal != ""){
							var decimales = parseFloat(decimal).toPrecision(((decimal.length + 3)>21?21:decimal.length + 3));
							var enteroDigito = 0;
							numeroConvertido += separadorDecimal;
							var cuentaDecimales = 0;
							console.log('DECIMALES ' + enteroDigito + " " + decimales);
							while(decimales != 0 && (""+(decimales * baseDestino)).indexOf("e")<0 ){
								enteroDigito = parseInt(decimales * baseDestino);
								//console.log('DECIMALES SIN PRECISION ' + ((decimales * baseDestino) - enteroDigito));
								decimales = ((decimales * baseDestino) - enteroDigito).toPrecision(((decimal.length + 3)>21?21:decimal.length + 3));
								numeroConvertido += digitos[enteroDigito];
								
								if(cuentaDecimales++ == 50){
									numeroConvertido += "...";
									decimales = 0;
									console.log('SALIENDO DE LOS DECIMALES ');
								}
								console.log('DECIMALES ' + enteroDigito + " " + decimales);
							}
						}


					}

				/*	
				}else{ //Son bases potencia
					if(potenciaBases == 1){ //Bases iguales, no se hace conversión
						numeroConvertido = numeroOrigen;
					}else if(baseOrigen > baseDestino){

					}else{

					}

				}
				*/
			}else{
				console.log('El origenValido es: ' + origenValido);
				
				$("#procedimiento").html("No se puede realizar la conversi\u00F3n, los d\u00EDgitos " + numeroConvertido.substring(0,numeroConvertido.length-1) + " no pertenecen a la base " + baseOrigen + ". " + leyendaComas);
				numeroConvertido = "";
			}

			$("#numeroC").val(numeroConvertido);
			numeroConvertido = "";
		}else{
			console.log('Error en al menos una de las bases: ' + baseOrigen + " " + baseDestino);
		}
		$("#procedimiento").append(mensajeBasesPotencia);

		
	}


var app = {
    // Application Constructor
    initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    // deviceready Event Handler
    //
    // The scope of 'this' is the event. In order to call the 'receivedEvent'
    // function, we must explicity call 'app.receivedEvent(...);'
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
    },
    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');

        console.log('Received Event: ' + id);
    }
};
