	var EMPTY_STRING = "";
    var ZERO_STRING = "0";
    var SPACE_STRING = " ";
    var SEPARATOR_DOT = ".";
    var SEPARATOR_COMMA = ",";
    var ERR_NOT_A_NUMBER = "El valor no es un número válido";
    var SCREEN_DATE = 1;
    var BBDD_DATE = 2;
    var SCREEN_DATE_RE = "/\d{2}\/\d{2}\/\d{4}/g";  
    var BBDD_DATE_RE = "/\d{8}/g";
 
    //LIBGENERAL.JS

    function leftPad(str, chr, times) {
	    var str2 = new String(EMPTY_STRING);
	    if (str == null) str = EMPTY_STRING;
		var realTimes = times - str.length;
		for (var i = 0; i < realTimes; i++) str2 = str2.concat(chr);
		return (str2.concat(str));
	}

	function rightPad(str, chr, times) {
		var str2 = new String(EMPTY_STRING);
		if (str == null) str = EMPTY_STRING;
		str2 = str2.concat(str);
		var realTimes = times - str.length;
		for (var i = 0; i < realTimes; i++) str2 = str2.concat(chr);
		return str2; 
	}

    function reverseString(str) {
    	if (str == undefined) return "";
        var str2 = new String(EMPTY_STRING);
        var count = str.length - 1;
        for (var i = count ; i > -1; i--) {
            str2 = str2.concat(str.substring(i, i+1));
        }
        return str2;
    }
    
    function replace(str, strReplace, strWith) {
        var i;
        var str2 = str;
        do {
            i = str2.indexOf(strReplace);
            if (i > 0) {
                str2 = str2.substring(0, i) + strWith + str2.substring(i + strReplace.length, str2.length);
            } else { 
                break;
            }
        } while(true);
        return str2;
    } 
 
 	function trim(cadena) {
		return ltrim(rtrim(cadena));
	}   
	
    function ltrim(strvar) {
    	if (strvar == undefined) return "";
    	var str = strvar;
    	if ( str == EMPTY_STRING ) return EMPTY_STRING;	 
    	for (var i = 0; i < str.length; i++) {
    		if ( str.substring(0, 1) == SPACE_STRING ) {
    			if (str.length > 1) {
    				str = str.substring(1);
    			} else {
    				str = EMPTY_STRING;
    			}
    		}
    	}
    	return str;
	}
	
	
       
    function rtrim(strvar) {
    	if (strvar == undefined) return "";
    	var str = reverseString(strvar);
    	return reverseString(ltrim(str));
    }


	function greaterThan(varnumber, greaterThan, includeBounds) {
	    var num1 = parseFloat(screen2Number(varnumber));
	    var num2 = parseFloat(screen2Number(greaterThan));
	    if (includeBounds) {
	        return ( parseFloat(num1) >= parseFloat(num2) );
	    } else {
	        return ( parseFloat(num1) > parseFloat(num2) );
	    }   
	}

	function lessThan(varnumber, lessThan, includeBounds) {
	    var num1 = parseFloat(screen2Number(varnumber));
	    var num2 = parseFloat(screen2Number(greaterThan));
	    if (includeBounds) {
	        return ( parseFloat(num1) <= parseFloat(num2) );
	    } else {
	        return ( parseFloat(num1) < parseFloat(num2) );
	    }   
	}

	function outsideBounds(varnumber, lowerLimit, upperLimit, includeBounds) {
	    if (includeBounds == undefined) {
	        includeBounds = false;
	    }
	    return ( greaterThan(varnumber, upperLimit, includeBounds) || lessThan(varnumber, lowerLimit, includeBounds) );
	}

	function insideBounds(varnumber, lowerLimit, upperLimit, includeBounds) {
	    if (includeBounds == undefined) {
	        includeBounds = false;
	    }
	    return !outsideBounds(varnumber, lowerLimit, upperLimit, includeBounds);
	}

function dateBBDD2Screen(datevar) {
	if ( datevar.length > 8 ) {
		return null;
	} else if ( datevar.match(/\d{8}/g) == null ) {
		return null;
	} else {
	    return datevar.substring(6, 10) + "/" + datevar.substring(4, 6) + "/" + datevar.substring(0,4);
	}
}

function dateScreen2BBDD(datevar) {
	if ( datevar.length > 10 ) {
		return null;
	} else if ( datevar.match(/\d{2}\/\d{2}\/\d{4}/g) == null ) {
		return null;
	} else {
	  return datevar.substring(6) + datevar.substring(3,5) + datevar.substring(0,2);
	}
}

function screen2Integer(varstrnumber) {
	var strNumber = trim("" + varstrnumber); 

 	if (strNumber == EMPTY_STRING || strNumber == null || strNumber == undefined) return null;
 	
    var chr = null;
    var str = "";
    for (var i = 0; i < strNumber.length; i++) {
        chr = strNumber.substr(i, 1);
        if ((chr <= '9' && chr >= '0') || chr == '-') {
           str += chr;
	    }
    }
    return screen2Number( str );
}

function screen2Number(varstrnumber) {

    var strNumber = trim("" + varstrnumber); 

 	var fNegative = false;
 	
 	if (strNumber == EMPTY_STRING || strNumber == null || strNumber == undefined) return null;
 	
	if (strNumber.substring(0,1) == "-") {
		 strNumber = strNumber.substring(1);
		 fNegative = true;
	}

    var str = reverseString(strNumber);
    var count = str.length;
    var chr = null;
    var decimalSeparator = null;
    var thousandsSeparator = null;
    for (var i = 0; i < count; i++) {
        chr = str.substr(i, 1);
        if (chr > '9' || chr < '0') {
           decimalSeparator = chr;
           break;
        }
    }
   

    str = strNumber;
    if (decimalSeparator != null) {
        if ( decimalSeparator != SEPARATOR_DOT && decimalSeparator != SEPARATOR_COMMA ) {
            return null;
        }
        if (decimalSeparator == SEPARATOR_DOT) {
            thousandsSeparator = SEPARATOR_COMMA;
        } else {
            thousandsSeparator = SEPARATOR_DOT;
        }

    } else {
      decimalSeparator = ",";
      thousandsSeparator = ".";
    }
    
    str = replace(str, thousandsSeparator, EMPTY_STRING);
    if (decimalSeparator != SEPARATOR_DOT) {
        str = replace(str, decimalSeparator, SEPARATOR_DOT);
    }
   
    try {
        if ( isNaN(str) ) {
            return null;
        }
    } catch (e) {
        return null;
    }

    str = trimZeros(str);
    

    if (fNegative) {
       return "-" + str;
    } else { 
      return str;    
    }   
}

function trimZeros(varnumber) { //PRIVATE (no invocar)
	var str = varnumber;
    while (str.substring(0, 1) == ZERO_STRING) 
		str = str.substring(1);
    while (str.substring(str.length - 1, str.length) == ZERO_STRING && str.indexOf(SEPARATOR_DOT) > 0 ) 
		str = str.substring(0, str.length - 1);
	if (str.substring(0, 1) == SEPARATOR_DOT) str = ZERO_STRING.concat(str);
	if (str.substring(str.length - 1) == SEPARATOR_DOT) 
		str = str.substring(0, str.length - 1);
	if (str == EMPTY_STRING) return ZERO_STRING;
	return str;
}

function number2Screen(varnumber, useThousands, decimalPositions, bRound) {

    var str = screen2Number(varnumber);

    if (str == null) {
        return null;
    }
    var fNegative = false;
	if (str.substring(0,1) == "-") {
		 str = str.substring(1);
		 fNegative = true;
	}
    var bEuro = false;
    if ( bRound != undefined && bRound == true) {
    	bEuro = true;
    }	  	
    var i = str.indexOf(SEPARATOR_DOT);
    var realPart = EMPTY_STRING;
    var decimalPart = EMPTY_STRING;
    if (i > 0) {
        realPart = str.substring(0, i);
        decimalPart = str.substring(i + 1, str.length);    
    } else {
        realPart = str;
    }
    if (decimalPositions != undefined) {
        decimalPart = rightPad(decimalPart, ZERO_STRING, decimalPositions);
        if (bEuro && decimalPart.length > decimalPositions) {
        	var s1 = Math.round(
        		parseFloat(
        			decimalPart.substr(0, decimalPositions) +
		        	"." + decimalPart.substring(decimalPositions)
		        	)
		        );
			decimalPart = "" + s1;  
  		}
    }

    if (useThousands) {
        realPart = reverseString(realPart);
        var formattedRealPart = EMPTY_STRING;
        var j = realPart.length;
        var k = 0;
        for (i = 0; i < j; i++) {
            formattedRealPart += realPart.substring(i, i+1);
            k++;
            if ( k == 3 && i < j - 1) {
                formattedRealPart += SEPARATOR_DOT;
                k = 0;
            }
        }
        realPart = reverseString(formattedRealPart);
    }
    if (decimalPart != EMPTY_STRING) {
        decimalPart = SEPARATOR_COMMA.concat(decimalPart);
    }
    if (!fNegative) {
        return realPart.concat(decimalPart);
    } else {
        return "-" + realPart.concat(decimalPart);
    }
}

function validateNumber(varnumber, realPositions, decimalPositions) {

	var str = screen2Number(varnumber);
    if (str == null) return false;
	
	if (str.substring(0,1) == "-") {
	    str = str.substring(1);
	}
  
    var i = str.indexOf(SEPARATOR_DOT);
    var realPart = EMPTY_STRING;
    var decimalPart = EMPTY_STRING;
    if (i > 0) {
        realPart = str.substring(0, i);
        decimalPart = str.substring(i + 1, str.length);    
    } else {
        realPart = str;
    }
      
    return((realPart.length <= realPositions )&& (decimalPart.length <= decimalPositions ));
}

//Retorna:
// -1 - Indefinido
//	0 - Entero positivo (Natural)
//	1 - Entero (negativo)
//	2 - Real positivo 
//	3 - Real (negativo)
function getClassOfNumber(varnumber) {
	var str = screen2Number(varnumber);
	if (str == null) return -1;
	var i = 0;
	if (str.indexOf(".") > -1) i += 2;
	if (str.indexOf("-") > -1) i += 1;
	return "" + i;
}

function isNegative(varnumber) {
	var str = getClassOfNumber(varnumber);
	if ( str == "1" || str == "3" ) return true;
	return false;
}

function roundNumber(varnumber, decimalPositions) {
	var str = screen2Number(varnumber);
	if (str == null) return null;
	if (decimalPositions == undefined) decimalPositions = 0;
	if (decimalPositions == 0) return "" + Math.round(parseFloat(str));
	return "" + ( Math.round( parseFloat(str) * Math.pow( 10, parseInt(decimalPositions) ) ) / Math.pow(10, parseInt(decimalPositions) ) ); 
}

