// Dependências: valid.js, num.js, str.js e num.vbs.
//

var ParsedNumber = 0	// Ultimo nº validado por uma das funções deste módulo.

// Retorna 'true' se o conteúdo de 'wdField' fôr um nº inteiro ou se estiver vazio. 'optReq' é um 
// campo opcional que indica se o campo é mandatório. Se fôr 'true' e o campo estiver vazio, será 
// apresentada uma mensagem de erro ao utilizador e a função retornará 'false'.
function isIntNumField (wdField, optReq, minVal, maxVal) {
	var res = isNumField (wdField, KMsgOnlyNumInts, optReq, minVal, maxVal)
	if (!res [0]) return false
	var n = res [1]
	
	if (Math.floor (n) != n) return _vError (wdField, KMsgOnlyInts)
	ParsedNumber = n
	return true
}

// Retorna 'true' se o conteúdo de 'wdField' fôr um nº inteiro ou um nº real que não tenha mais do
// que 'maxPrecision' casas decimais, ou então, se estiver vazio.  'optReq' é um parâmetro opcional 
// que indica se o campo é mandatório. Se fôr 'true' e o campo estiver vazio, será apresentada uma 
// mensagem de erro ao utilizador e a função retornará 'false'.
function isRealNumField (wdField, optReq, maxPrecision, minVal, maxVal) {
	var res = isNumField (wdField, KMsgOnlyNums, optReq, minVal, maxVal)
	if (!res [0]) return false
	var n = res [1]

	var str = wdField.value // Este valor já foi devidamente rectificado por 'isNumField'.
	if (maxPrecision > 0) {
		var i
		// Testar se o nº de casas decimais não ultrapassa 'maxPrecision'.
		if ((i = str.lastIndexOf (rem_fracsep)) >= 0) {
			if (str.length - i - 1 > maxPrecision)
				return _vError (wdField, KMsgPrecOverflow.replace ("$maxPrecis", maxPrecision))
		}
	}
	ParsedNumber = n
	return true
}

// FUNÇÕES PRIVADAS. Usadas unicamente por funções deste módulo.

// Verifica se 'wdField' é numérico. A função retorna um array de 2 elementos, em que o primeiro
// é um "boolean" que indica se o conteúdo de 'wdField' é realmente numérico, e o segundo é o nº
// em si. 'optReq' é um parâmetro opcional que indica se o campo é mandatório. Se fôr 'true' e o
// campo estiver vazio, será apresentada uma mensagem de erro ao utilizador e a função retornará
// 'false' no primeiro elemento.
// No caso do conteúdo de 'wdField' não ser numérico, 'badDataMsg' será apresentado como mensagem.
function isNumField (wdField, badDataMsg, optReq, minVal, maxVal) {
	var n = 0
	var res = true
	if (wdField.value) {
		n = cvtNum (wdField.value)
		
		if (err_badnum)
			res =  _vError (wdField, badDataMsg)
		else {
			var str = n.toString ()
			// Se necessário, corrigir os dados do próprio controlo.
			var b = rem_fracsep != in_fracSep && in_fracSep != ""
			if (b || str.length != wdField.value.length)
				wdField.value = b ? str.replace (in_fracSep, rem_fracsep) : str
			// Validar limites.
			var msg = ""
			if (minVal != undefined) {
				if (n < minVal)
					if (maxVal != undefined)
						msg = KMsgNumMustBeBetween.replace ("$minVal", minVal).replace ("$maxVal", maxVal)
					else
						msg = KMsgNumMustBeBigger.replace ("$minVal", minVal)
			}
			else if (maxVal != undefined)
				if (maxVal > n)
					msg = KMsgNumMustBeSmaller.replace ("$maxVal", maxVal)
			if (msg != "") return _vError (wdField, msg)
		}
	}
	else {
		// O campo está vazio. No caso de ser um campo mandatório, apresentar erro.
		if (optReq != undefined && optReq) res = _vError (wdField, KMsgReqField)
	}

	return Array (res, n)
}
