// ----------------------------------------------------------
// 		Compara dos números
//-----
function comparaNumeros(cNum1, cNum2, cSeparadorDecimal) {
	var cSeparadorMil = ".";
	var nNum1;
	var nNum2;
	
	if (cSeparadorDecimal == null) cSeparadorDecimal = ",";
	if (cSeparadorDecimal == ".") cSeparadorMil = ",";
	
	// Se eliminan los separadores de mil
	if (cSeparadorMil == ".") {
		cNum1 = sinPuntos(cNum1);
		cNum2 = sinPuntos(cNum2);
	}
	else {
		cNum1 = sustiTexto(cNum1, cSeparadorMil, "");
		cNum2 = sustiTexto(cNum2, cSeparadorMil, "");
	}

	// Se pone como separador decimal el punto
	if (cSeparadorDecimal == ",") {
		cNum1 = sustiTexto(cNum1, cSeparadorDecimal, "\.");
		cNum2 = sustiTexto(cNum2, cSeparadorDecimal, "\.");
	}
		
	// Si alguno de los números es incorrecto
	if (isNaN(cNum1) || isNaN(cNum2)) return -1;

	// Se convierten a float
	nNum1 = parseFloat(cNum1);
	nNum2 = parseFloat(cNum2);

	// Se devuelve el valor que corresponda
	if (nNum1 == nNum2) return 0;
	if (nNum1 > nNum2) return 1;
	if (nNum2 > nNum1) return 2;
}

// ----------------------------------------------------------
// 		Devuelve un número editado, si se puede
//-----
function dameNumEditado(nValor, nDecimales, cSeparadorMil, cSeparadorDecimal) {
  var nNum   = str2Num(nValor, cSeparadorMil, cSeparadorDecimal);
  var nResul = nValor;
    
  if (nNum != null && nNum != "") nResul = dameNumFormateado(nNum, nDecimales, cSeparadorMil, cSeparadorDecimal);
  
  return nResul;
}

// ----------------------------------------------------------
// 		Devuelve un número (informático, con punto decimal) formateado
//-----
function dameNumFormateado(nValor, nDecimales, cSeparadorMil, cSeparadorDecimal) {
	var cResul;
	var cEnteros;
	var cDecimales;
	var nPos;
	var cAux;
	var cCar;

	nValor = nValor * Math.pow(10, nDecimales);
	nValor = Math.round(nValor);
	nValor = nValor / Math.pow(10, nDecimales);

	cResul = nValor.toString();
		
	if (cSeparadorMil == null) cSeparadorMil = ".";
	if (cSeparadorDecimal == null) cSeparadorDecimal = ",";

	nPos = cResul.indexOf(".");
	if (nPos == -1) nPos = cResul.length;

	cEnteros = cResul.substr(0, nPos);	
	cDecimales = izquierda(rellenaDer(cResul.substr(nPos+1), nDecimales, "0"), nDecimales);
	
	cAux = "";
	for (var nI = cEnteros.length-1; nI >= 0; nI--) {
		cCar = cEnteros.charAt(nI);
		cAux = cCar + cAux;
		if (nI > 0) {
			if ((cEnteros.length - nI) % 3 == 0) cAux = cSeparadorMil + cAux;
		}
	}
	if (cAux == "") cAux = "0";
	if (izquierda(cAux, 2 ) == "-.") cAux = "-" + cAux.substr(2);
	if (nDecimales == 0) cSeparadorDecimal = "";
	
	cResul = cAux + cSeparadorDecimal + cDecimales;
	
	return cResul;
}

// ----------------------------------------------------------
// 		Devuelve true si el número tiene el formato indicado
//-----
function esFormatoNumerico(xValor, nEnteros, nDecimales, cSeparadorMil, cSeparadorDecimal, cCampoErr) {
	var lResul        = false;
	var lResulMil     = true;
	var cValor        = "" + xValor;
	var nPosMil       = -1;
	var nPosDec;
	var cParteEntera;
	var cParteDecimal;
	var cTxtSeparador = "";
	var cER;

	do {
    // Se eliminan los blancos de izquierda y derecha
    cValor = trim(cValor);
  
    if (cSeparadorMil != "") {
      // Si hay separador de mil
  		// Comprobar que el formato de miles es correcto (cada 4 posiciones)
  		nPosDec = cValor.indexOf(cSeparadorDecimal);
  		if (nPosDec == -1) nPosDec = cValor.length;
  		while ((nPosMil =	cValor.indexOf(cSeparadorMil, ++nPosMil)) > -1) {
  			// si comienza con miles ==> error
  			if (nPosMil < 1) {					
  				lResulMil = false;
  				break;										
  			}
  			// ¿cada 4 posiciones?
  			if ((nPosDec - nPosMil) % 4 != 0) {	
  				lResulMil = false;
  				break;										
  			}
  		}
  		if (!lResulMil) break;
  		
  		if (cSeparadorMil == ".") cSeparadorMil = "\\.";
  		cER = new RegExp(cSeparadorMil, "g"); 
  		cValor = (cValor.replace(cER, ""));
		}
    
		nPosDec = cValor.indexOf(cSeparadorDecimal);
		
		if (nPosDec == -1) nPosDec = cValor.length;
	
		cParteEntera  = cValor.substr(0, nPosDec);
		cParteDecimal =	cValor.substr(nPosDec+1);

		if (isNaN(cParteEntera)) break;
    if (cParteEntera.toUpperCase().indexOf("E") != -1) break;   // la notación exponencial no se considera correcta
		if (cParteDecimal.length > 0 & !esSoloNumeros(cParteDecimal)) break;

		if (cParteEntera.length > nEnteros) break;
		if (cParteDecimal.length > nDecimales) break;
			
		lResul = true;
	} while (false);
	
 	if(!lResul) {
		if (cCampoErr != null) {
			if (cSeparadorDecimal == ".") cTxtSeparador = "punto";
			if (cSeparadorDecimal == ",") cTxtSeparador = "coma";
			agregaMensaje("G0040", cCampoErr, nEnteros + " enteros y " + 
	                                      nDecimales + " decimales, " +
																				" separados con " + cTxtSeparador); 
		}
	}
	
	return lResul;
}

// ----------------------------------------------------------
// 		Devuelve true si el número (editado con separador de miles) tiene el formato indicado
//-----
function esNumeroEditado(cValor, nEnteros, nDecimales, cCampoErr) {
	return (esFormatoNumerico(cValor, nEnteros, nDecimales, ".", ",", cCampoErr));
}

// ----------------------------------------------------------
// 		Devuelve true si sólo hay números
//-----
function esSoloNumeros(cValor, cCampoErr) {
	var lResul = false;
	var erNumeros = /^([0-9])+$/
	
	lResul = erNumeros.test(cValor);
	if(!lResul) if (cCampoErr != null) agregaMensaje("G0022", cCampoErr); 
	
	return lResul;
}

// ----------------------------------------------------------
// 		Devuelve un número (informático, con punto decimal) transformado desde una cadena
//-----
function str2Num(cNum, cSeparadorMil, cSeparadorDecimal) {
  var nResul = cNum;
  var nPosDec;
  
  if ( esFormatoNumerico(cNum, 99, 99, cSeparadorMil, cSeparadorDecimal) ) {
    nResul = ( (cSeparadorMil == ".") ? sinPuntos(cNum) : sustiTexto(cNum, cSeparadorMil, "") );
    nPosDec = nResul.indexOf(cSeparadorDecimal);
  
    if (nPosDec > -1) nResul = nResul.substr(0, nPosDec) + "." + nResul.substr(nPosDec+1);
  } 
  else nResul = null;

	return nResul;
}

